XDocument Traversal

本文关键字:Traversal XDocument | 更新日期: 2023-09-27 18:17:27

我是LINQ to XML世界的新手。我试图检索Identity的值,但只有当Credentialdomain属性是"NetworkID"时。下面是我测试的代码:

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,如果没有找到任何元素?

XDocument Traversal

Where()后面删除FirstOrDefault():

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

Where()返回空结果集,FirstOrDefault()返回空结果集,这就是为什么.Where().FirstOrDefault().Descendants()导致空引用异常。

如果使用

    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;