我是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()
。
是否可以编写查询,以便在找不到任何元素时返回null
或Identity
?
答案 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;