我有一个xml doc,我正在解析它是否存在具有特定属性的元素。
当我这样做时
item.Descendants().Elements("nameValue");
我可以看到一堆结果,当我向下钻取时,我甚至可以看到属性
假设我有一个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");
上述两项工作都不是
编辑:我想我已经弄清楚它为什么会起作用。我的nameValue元素集合有数百个项目,并非所有项目都有&#34; idref&#34;属性,这就是它抛出我的对象引用错误的原因,即使该集合中确实存在该特定属性。我的解决方案是不使用Linq并使用XPathSelectElements代替
var nameValueArr = element.XPathSelectElements("descendant::nameValue[@idref='myIDRef']");
答案 0 :(得分:1)
我现在看到了你的更新,你仍然可以使用linq到xml来获得你期望的结果:
var result= item.Descendants("nameValue")
.Where(e=>(string)e.Attribute("idref")=="myIDRef");
如果缺少该属性,则投放将返回null
,因此,您将保存错误,因为如果属性不存在,您将比较null
和"myIDRef"
元件
答案 1 :(得分:0)
您可以使用
var el = item.Descendants("nameValue")
.FirstOrDefault(x=>x.Attribute("idref")?.Value=="myIDRef");
如果有多个元素,Single将返回错误,而FirstOrDefault返回第一个元素,如果没有元素,则返回null。
在我阅读您的编辑后,您可以在?.
之前使用null-condicional运算符(Value
),就像上面的代码一样。如果没有&#34; idref&#34;属性,它将返回null,否则它将评估Value
。