获取 xelement 属性值

Posted

技术标签:

【中文标题】获取 xelement 属性值【英文标题】:get xelement attribute value 【发布时间】:2013-07-21 06:54:50 【问题描述】:

我有一个如下所示的 XElement:

<User ID="11" Name="Juan Diaz" LoginName="DN1\jdiaz" xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/" />

如何使用 XML 提取 LoginName 属性的值?我尝试了以下,但 q2 “枚举没有结果”。

var q2 = from node in el.Descendants("User")
    let loginName = node.Attribute(ns + "LoginName")
    select new  LoginName = (loginName != null) ;
foreach (var node in q2)

    Console.WriteLine("LoginName=0", node.LoginName);

【问题讨论】:

【参考方案1】:
var xml = @"<User ID=""11"" 
                  Name=""Juan Diaz"" 
                  LoginName=""DN1\jdiaz"" 
                  xmlns=""http://schemas.microsoft.com/sharepoint/soap/directory/"" />";

var user = XElement.Parse(xml);
var login = user.Attribute("LoginName").Value; // "DN1\jdiaz"

【讨论】:

请注意,XAttribute 可以为空(不是这里是),因此可能需要在获取值之前进行空检查。【参考方案2】:
XmlDocument doc = new XmlDocument();
doc.Load("myFile.xml"); //load your xml file
XmlNode user = doc.getElementByTagName("User"); //find node by tag name  
string login = user.Attributes["LoginName"] != null ? user.Attributes["LoginName"].Value : "unknown login";

最后一行代码,设置string login,格式如下...

var variable = condition ? A : B;

基本上就是说如果条件为true,则变量等于A,否则变量等于B。

【讨论】:

最后一个字符串应该是:string login = user.Attributes?["LoginName"] ?? "unknown login";【参考方案3】:

来自 XAttribute.Value 的文档:

如果你正在获取值并且属性可能不存在,使用显式转换运算符更方便,并将属性分配给可空类型,例如stringInt32Nullable&lt;T&gt;。如果该属性不存在,则可空类型设置为空。

【讨论】:

参考文档link中的第二个例子演示了转换运算符的用法。【参考方案4】:

我最终使用字符串操作来获取值,因此我将发布该代码,但我仍然希望看到 XML 方法(如果有的话)。

string strEl = el.ToString();
string[] words = strEl.Split(' ');
foreach (string word in words)

    if (word.StartsWith("LoginName"))
    
        strEl = word;
        int first = strEl.IndexOf("\"");
        int last = strEl.LastIndexOf("\"");
        string str2 = strEl.Substring(first + 1, last - first - 1); 
        //str2 = "dn1\jdiaz"
    

【讨论】:

不要对 XML 进行字符串操作。 XML 通常看起来很简单,但事实并非如此。所以,使用微软提供的工具来解析吧。

以上是关于获取 xelement 属性值的主要内容,如果未能解决你的问题,请参考以下文章

XElement 的子级

使用动态特性读取 XML 结构

如何从XElement获取标签

如何使 XElement 的值包含在 ![CDATA[***]] 中?

如何搜索具有特定属性值的 XElement?

如何确定 XElement.Elements() 是不是包含具有特定名称的节点?