繁体   English   中英

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

[英]XML to Linq Element in Descendants getting object ref error when selecting by attribute

我有一个 xml 文档,我正在解析它以查看具有特定属性的元素是否存在。

当我做

item.Descendants().Elements("nameValue");

我可以看到一堆结果,当我向下钻取时,我什至可以看到属性

假设我有一个如下所示的 nameValue 节点:

<nameValue idref="myIDRef" name="elementName"/>

我尝试了 2 种不同的方法来通过 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 ,因此,您"myIDRef"错误,因为如果元素中不存在属性,您会将null"myIDRef"进行比较

你可以用

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM