XML到后代中的LINQ Element在通过属性选择时会遇到对象ref错误



我有一个我正在解析的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

最新更新