XDocument Traversal
本文关键字:Traversal XDocument | 更新日期: 2023-09-27 18:17:27
我是LINQ to XML世界的新手。我试图检索Identity
的值,但只有当Credential
的domain
属性是"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()
。
是否可以编写查询,以便它返回Identity
或null
,如果没有找到任何元素?
在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;