获取XElement属性值

37

我有一个看起来像这样的XElement:

<User ID="11" Name="Juan Diaz" LoginName="DN1\jdiaz" xmlns="http://schemas.microsoft.com/sharepoint/soap/directory/" />
我该如何使用XML提取LoginName属性的值?我尝试了以下方法,但是报错“枚举未产生结果”。
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);
}
4个回答

52
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"

3
请注意,XAttribute可能为空(但不是此处),因此在获取值之前可能需要进行空值检查。 - user420667

4
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。

2
最后的字符串应该是: string login = user.Attributes?["LoginName"] ?? "未知账户"; - Evgenii Kosiakov

3

来自XAttribute.Value文档:

如果您要获取值,而属性可能不存在,则更方便使用显式转换运算符,并将属性分配给nullable类型,例如stringInt32Nullable<T>。如果该属性不存在,则nullable类型设置为null。


参考文档中的第二个示例链接演示了转换运算符的用法。 - Christopher King

-1

最终我使用了字符串操作来获取值,所以我会发布那段代码,但如果有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"
    }
}

6
不要对XML进行字符串操作。XML在一般情况下似乎很简单,但实际上并非如此。因此,请使用Microsoft提供的工具来解析它。 - Cédric Bignon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接