【问题标题】:Linq to XML - Null Reference Exception when using linq query.nLinq to XML - 使用 linq query.n 时出现空引用异常
【发布时间】:2009-08-26 02:05:32
【问题描述】:

我有一个简单的 XML 文件:

<?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;

它不工作,我得到空引用异常。

我做错了什么?

【问题讨论】:

    标签: c# .net linq-to-xml


    【解决方案1】:

    改用这个:

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

    由于myXmlDoc 的类型为XElement,因此没有“文档元素”,因此元素的根根节点(&lt;ConveioValidacao&gt;)。由于这是根节点,因此您无需在 Elements 方法中指定它,因为这是文档中的当前位置。

    作为旁注,我建议您将 myXmlDoc 重命名为 myXmlElement 以减少混淆。

    【讨论】:

      【解决方案2】:

      .Element 方法获取给定元素的第一个子元素,在这里 ConveioValidacao 不是子元素,它是父元素,当您通过 XEelemnt.Load() 方法加载时,它会获取 ConveioValidacao 并且它是子元素,所以你应该使用 Andrew 的代码。

      【讨论】:

        【解决方案3】:

        尝试后代而不是元素

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

        【讨论】:

        • 这会阻止它抛出异常,但它并不能解决问题。 myXmlDocXElement 而不是 XDocument,这意味着 &lt;ConveioValidacao&gt; 节点不是它的后代。
        猜你喜欢
        • 2012-02-07
        • 2011-07-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-11-30
        • 2011-02-02
        相关资源
        最近更新 更多