如何从具有特定属性值的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,任何帮助感激!

如何从具有特定属性值的XDocument中选择特定节点

在您的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']")