我有一个我正在解析的XML文档,以查看是否存在特定属性的元素。
当我做
时item.Descendants().Elements("nameValue");
我可以看到一堆结果,当我向下钻取时,我甚至可以看到属性
假设我有一个看起来像这样的名称节点:
<nameValue idref="myIDRef" name="elementName"/>
我尝试了两种不同的方法来通过IDREF找到此元素,并且两个返回对象参考错误。我敢肯定这很简单,但是我已经盯着这个很久了,以至于我真的很困
item.Descendants().Select(a => a.Element("nameValue")).Where(b => b.Attribute("idref").Value == "myIDRef");
item.Descendants().Elements("nameValue").Single(a => a.Attribute("idref").Value == "myIDRef");
以上工作
编辑:我想我已经弄清楚了为什么它可以工作。我的名称值元素的集合有数百个项目,并非所有项目都有一个" IDREF"属性,这就是为什么即使该特定属性确实存在于集合中。
,即使该特定属性确实存在。我对此的解决方案是不使用linq,而是使用XPathSelectelements
var nameValueArr = element.XPathSelectElements("descendant::nameValue[@idref='myIDRef']");
我现在看到了您的更新,您仍然可以使用Linq到XML来获得您期望的结果:
var result= item.Descendants("nameValue")
.Where(e=>(string)e.Attribute("idref")=="myIDRef");
铸件将返回null
如果属性丢失,因此,您是错误的,因为如果元素中不存在属性,则将null
与CC_2进行比较
您可以使用
var el = item.Descendants("nameValue")
.FirstOrDefault(x=>x.Attribute("idref")?.Value=="myIDRef");
如果有多个元素,则单身将返回错误,而FirstorDefault如果没有元素,则返回第一个元素或null。
阅读您的编辑后,您可以在Value
之前使用Null-bongicional Operator(?.
),就像上面的代码中一样。如果没有" IDREF"属性,它将返回null,否则评估Value
。