如何从具有特定属性值的XDocument中选择特定节点
本文关键字:XDocument 选择 节点 属性 | 更新日期: 2023-09-27 18:02:09
这是我的xml,
<root>
<A>
<B id="ABC">one
</B>
<B id="ZYZ">two
</B>
<B id="QWE">three
</B>
<B>four
</B>
</A>
</root>
使用下面的c#代码只获取节点<B id="QWE">three</B>
,
var x = xdoc.Descendants("B").Where(ele => ele.Attribute("id").Value.Equals("QWE"));
,但变量x
总是null,任何帮助感激!
在您的xml示例中,并非所有B
节点都具有id
属性。Attribute("id")
将为这些节点返回null,当您以null访问Value
时,您将获得NullReferenceException
。
使用下一个代码来避免错误:
var x = xdoc.Descendants("B")
.Where(ele => (string)ele.Attribute("id") == "QWE");
Attribute
方法返回XElement
。当您将它强制转换为string
时,它采用该元素的字符串表示形式,在我们的示例中,这将是一个属性的值(您可以在msdn上看到更多关于将XElement强制转换为字符串的详细信息)。现在,当Attribute
返回null时,将其强制转换为string将返回null。==
操作符将始终为null和"QWE"
文字返回false,不会抛出异常。
如果,出于某种原因,您不想将XElement
转换为string
,您可以使用三元运算符来查看ele
节点是否存在id
属性(代码很快变得不那么可读)。
var x = xdoc.Descendants("B")
.Where(ele => (ele.Attribute("id") != null ? ele.Attribute("id").Value : null) == "QWE");
为什么不用XPath呢?
var x = xdoc.XPathSelectElement("//B[@id='QWE']")