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

时间:2014-05-07 05:19:46

标签: c# xml

这是我的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始终为空,任何帮助都值得赞赏!

2 个答案:

答案 0 :(得分:4)

在xml示例中,并非所有B个节点都具有id属性。 Attribute("id")将为该节点返回null,当您在null上访问Value时,您将获得NullReferenceException

使用下一个代码来避免该错误:

var x = xdoc.Descendants("B")
            .Where(ele => (string)ele.Attribute("id") == "QWE");

Attribute方法返回XElement。当你把它强制转换为string时,它会采用该元素的字符串表示形式,在我们的例子中,它将是属性的值(你可以看到关于转换XElement to string at msdn的更多细节)。现在,当Attribute返回null时,将其转换为字符串将为null。 ==运算符将始终返回false表示null和"QWE"字面值,不会抛出任何异常。

如果由于某种原因,您不想将XElement投射到string,则可以使用ternary operator查看id是否存在ele属性1}}节点(代码变得不那么快可读)。

var x = xdoc.Descendants("B")
            .Where(ele => (ele.Attribute("id") != null ? ele.Attribute("id").Value : null) == "QWE");

答案 1 :(得分:0)

为什么不使用XPath?

var x = xdoc.XPathSelectElement("//B[@id='QWE']")