XDocument遍历

3

我是LINQ to XML世界的新手。 我试图在Credentialdomain属性为“NetworkID”时仅检索Identity的值。 这是我正在测试的代码:

XML片段:

<Sender>
  <Credential domain="NetworkID">
    <Identity>MyIdentity</Identity>
    <SharedSecret>MySharedSecret</SharedSecret>
  </Credential>
  <UserAgent>MyUserAgent</UserAgent>
</Sender>

C#:

var credential = xdoc.Descendants("Sender")
         .Elements("Credential")
         .Where(x => x.Attribute("domain").Value == "NetworkID").FirstOrDefault()
         .Descendants("Identity").FirstOrDefault();

问题:

显然,如果找不到Credential节点,则LINQ查询将生成一个错误,因为我在null上调用.Descendants()

是否可以编写查询,以便如果未找到任一元素,则返回Identitynull

2个回答

4

Where() 后面删除 FirstOrDefault() 即可:

var credential = xdoc.Descendants("Sender")
                     .Elements("Credential")
                     .Where(x => x.Attribute("domain").Value == "NetworkID")
                     .Descendants("Identity")
                     .FirstOrDefault();

Where()方法返回一个空的结果集,而对于空的结果集调用FirstOrDefault()方法会返回null,这就是为令.Where().FirstOrDefault().Descendants()语句抛出了空引用异常的原因。


1

如果你使用

    var identity = 
        xdoc.Descendants("Sender")
        .Elements("Credential")
        .Where(x => (string)x.Attribute("domain") == "NetworkID")
        .Descendants("Identity")
        .FirstOrDefault();

你应该得到你想要的。或者你需要将代码分解,例如在第一部分中执行一个FirstOrDefault()。

   var credential = xdoc.Descendants("Sender").Elements("Credential").FirstOrDefault(c => (string)c.Attribute("domain") == "NetworkID");
   var identity = credential != null ? credential.Element("Identity") : null;

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