XDocument Traversal

时间:2011-12-09 17:35:24

标签: c# xml linq linq-to-xml

我是LINQ to XML世界的新手。我正在尝试检索Identity的值,但仅当domain的{​​{1}}属性为“NetworkID”时才会检索。这是我正在测试的代码:

XML代码段

Credential

C#:

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

问题:

显然,如果找不到var credential = xdoc.Descendants("Sender") .Elements("Credential") .Where(x => x.Attribute("domain").Value == "NetworkID").FirstOrDefault() .Descendants("Identity").FirstOrDefault(); 节点,LINQ查询将生成错误,因为我在Credential上调用.Descendants()

是否可以编写查询,以便在找不到任何元素时返回nullIdentity

2 个答案:

答案 0 :(得分:3)

只需在FirstOrDefault()之后移除Where()

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

Where()返回空结果集,空结果集上的FirstOrDefault()返回null,这就是.Where().FirstOrDefault().Descendants()导致空引用异常的原因。

答案 1 :(得分: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;