在按属性选择时,后代中的XML到Linq元素会出现对象引用错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在按属性选择时,后代中的XML到Linq元素会出现对象引用错误相关的知识,希望对你有一定的参考价值。

我有一个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元素集合有数百个项目,并非所有项目都具有“idref”属性,这就是为什么它抛出我的对象引用错误,即使该集合中确实存在该特定属性。

我的解决方案是不使用Linq并使用XPathSelectElements

var nameValueArr = element.XPathSelectElements("descendant::nameValue[@idref='myIDRef']");
答案

我现在看到了你的更新,你仍然可以使用linq to xml来获得你期望的结果:

var result= item.Descendants("nameValue")
                .Where(e=>(string)e.Attribute("idref")=="myIDRef");

如果缺少属性,则转换将返回null,因此,您将保存错误,因为如果元素中不存在属性,您将比较null"myIDRef"

另一答案

你可以用

var el = item.Descendants("nameValue")
  .FirstOrDefault(x=>x.Attribute("idref")?.Value=="myIDRef");

如果有多个元素,则Single将返回错误,而FirstOrDefault返回第一个元素,如果没有元素,则返回null。

在我阅读你的编辑之后,你可以在?.之前使用null-condicional运算符(Value),就像上面的代码一样。如果没有“idref”属性,它将返回null,否则它将评估Value

以上是关于在按属性选择时,后代中的XML到Linq元素会出现对象引用错误的主要内容,如果未能解决你的问题,请参考以下文章

Linq to XML 后代和元素有啥区别

C# LINQ-to-XML 选择子元素属性最大的元素

使用 LINQ 选择具有不同名称的后代节点

LINQ到XML-查询多个元素和属性

课时73.后代选择器和子元素选择器(理解)

无法使用 LINQ 解析 XML 文件中的属性