如何搜索具有特定属性值的 XElement?

Posted

技术标签:

【中文标题】如何搜索具有特定属性值的 XElement?【英文标题】:How do I search a XElement with an specific attribute value? 【发布时间】:2014-05-03 16:57:16 【问题描述】:

我需要通过其属性之一的值来搜索子节点,例如说我有这个 XML

<Root>
    <Child Name="1" foo="a"/>
    <Child Name="2" foo="a"/>
    <Child Name="3" foo="b"/>
    <Child Name="4" foo="c"/>
    <OhterTag/>
</Root>

我想提取属性 Name 值为 2 的节点 Child 。 . .我想要完整的节点,而不仅仅是节点的标签。

我尝试过类似的方法

root.Elements("Attr").Where(child => child.Attribute("Name").Value == "2");

但是我没有工作

【问题讨论】:

【参考方案1】:

使用元素名称,即“Child”,它应该按照您的方式工作......并且由于在这种情况下.Where 返回一个IEnumerable&lt;XElement&gt;,要获取该元素,请使用.First() at结束。

root.Elements("Child")
    .Where(child => child.Attribute("Name").Value == "2")
    .First()

...或者您可以只使用带有.First()的谓词

root.Elements("Child")
    .First(child => child.Attribute("Name").Value == "2")

最后,您可以使用 .FirstOrDefault() 以防节点不存在,以避免空引用异常,根据@HamletHakobyan 建议的下面 cmets 中的讨论

root.Elements("Child")
    .FirstOrDefault(child => child.Attribute("Name").Value == "2")

【讨论】:

使用FirstOrDefault 避免异常。 一切都取决于应用程序的设计和预期的输入,但是是的,这也是一种选择。 如果有问题使用术语search,那么它适用not found 答案:)【参考方案2】:

你可以,如果你想,使用XPath实现同样的效果-

using System.Xml.XPath;

// ...

XElement result = root.XPathSelectElement("//Child[@Name='2']");

【讨论】:

以上是关于如何搜索具有特定属性值的 XElement?的主要内容,如果未能解决你的问题,请参考以下文章

如何确定 XElement.Elements() 是不是包含具有特定名称的节点?

如何创建获取请求以获取具有特定属性值的对象

如何查询具有特定属性值的核心数据对象

如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?

如何检查 List<T> 元素是不是包含具有特定属性值的项目

如何找到具有特定“类型”属性值的 <script> 元素?