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

use*_*272 2 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>
Run Code Online (Sandbox Code Playgroud)

使用以下C#代码仅获取节点<B id="QWE">three</B>

var x = xdoc.Descendants("B").Where(ele => ele.Attribute("id").Value.Equals("QWE"));
Run Code Online (Sandbox Code Playgroud)

但变量x始终为空,任何帮助表示赞赏!

Ily*_*nov 5

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

使用下面的代码来避免该错误:

var x = xdoc.Descendants("B")
            .Where(ele => (string)ele.Attribute("id") == "QWE");
Run Code Online (Sandbox Code Playgroud)

Attribute方法返回XElement. 当您将其转换为 时string,它会采用该元素的字符串表示形式,在我们的例子中,这将是属性的值(您可以在 msdn 上查看有关将 XElement 转换为字符串的更多详细信息)。现在,当Attribute返回 null 时,将其转换为字符串将给出 null。==对于 null 和字面量,运算符将始终返回 false "QWE",不会抛出异常。

如果由于某种原因,您不想转换XElementstring,则可以使用三元运算符来查看节点是否id存在属性ele(代码很快就会变得不那么可读)。

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