如何搜索具有特定属性值的 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<XElement>
,要获取该元素,请使用.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() 是不是包含具有特定名称的节点?
如何从对象数组中获取具有属性的列表,除非它包含具有特定值的另一个项目?