Linq to XML - 当使用linq查询时出现空引用异常。

3

I have a simple XML file:

<?xml version="1.0" encoding="utf-8"?>
<ConvenioValidacao>
    <convenio ven_codigo="1" tipoValidacao="CPF"></convenio>
    <convenio ven_codigo="1" tipoValidacao="MATRICULA"></convenio>
    <convenio ven_codigo="3" tipoValidacao="CPF"></convenio>
    <convenio ven_codigo="4" tipoValidacao="CPF"></convenio>
</ConvenioValidacao>

我正在尝试使用Linq to XML对这个XML文件进行一个简单的查询,以下是我的操作:

var myXmlDoc = XElement.Load(filePath);
var result =  from convenio in myXmlDoc.Element("ConvenioValidacao").Elements("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;

它没有起作用,我得到了空引用异常。

我做错了什么?

3个回答

9
请使用以下内容替代:
var result = from convenio in myXmlDoc.Elements("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;

由于myXmlDocXElement类型,因此没有“文档元素”,因此元素的根节点(<ConveioValidacao>)就是根。由于这是根节点,您不需要在Elements方法中指定它,因为它是文档中的当前位置。

顺便说一下,我建议您将myXmlDoc重命名为myXmlElement以减少混淆。


1

Element方法获取给定元素的第一个子元素,在这里ConveioValidacao不是子元素,而是父元素。当您使用XEelemnt.Load()方法加载时,它会获取ConveioValidacao及其子元素,因此您应该使用Andrew的代码。


0

尝试使用Descendants而不是Elements

var result =  from convenio in myXmlDoc.Descendants("ConveioValidacao").Descendants("convenio")
                 where (string)convenio.Attribute("ven_codigo") == "1" &&
                 (string)convenio.Attribute("tipoValidacao") == "CPF"
                 select convenio;

这样做可以防止它抛出异常,但并不能解决问题。myXmlDoc是一个XElement而不是XDocument,这意味着<ConveioValidacao>节点不是它的后代。 - Andrew Hare

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接