这是我的xml,
<root>
<A>
<B id="ABC">one
</B>
<B id="ZYZ">two
</B>
<B id="QWE">three
</B>
<B>four
</B>
</A>
</root>
使用以下 c#代码仅获取节点<B id="QWE">three</B>
,
var x = xdoc.Descendants("B").Where(ele => ele.Attribute("id").Value.Equals("QWE"));
但变量x
始终为空,任何帮助都值得赞赏!
答案 0 :(得分:4)
在xml示例中,并非所有B
个节点都具有id
属性。 Attribute("id")
将为该节点返回null,当您在null上访问Value
时,您将获得NullReferenceException
。
使用下一个代码来避免该错误:
var x = xdoc.Descendants("B")
.Where(ele => (string)ele.Attribute("id") == "QWE");
Attribute
方法返回XElement
。当你把它强制转换为string
时,它会采用该元素的字符串表示形式,在我们的例子中,它将是属性的值(你可以看到关于转换XElement to string at msdn的更多细节)。现在,当Attribute
返回null时,将其转换为字符串将为null。 ==
运算符将始终返回false表示null和"QWE"
字面值,不会抛出任何异常。
如果由于某种原因,您不想将XElement
投射到string
,则可以使用ternary operator查看id
是否存在ele
属性1}}节点(代码变得不那么快可读)。
var x = xdoc.Descendants("B")
.Where(ele => (ele.Attribute("id") != null ? ele.Attribute("id").Value : null) == "QWE");
答案 1 :(得分:0)
为什么不使用XPath?
var x = xdoc.XPathSelectElement("//B[@id='QWE']")