【问题标题】:LINQ to XML NullReferenceException AFTER returning the results?LINQ to XML NullReferenceException 返回结果后?
【发布时间】:2009-10-07 04:53:16
【问题描述】:

我对 .NET 很陌生,对 LINQ 更是如此,我刚刚开始探索我正在从事的一个小项目。

我有一个从应用程序生成的 XML 文件,其中包含一些我想解析为专有格式并保存在文件中的值。

我能够使一个 LINQ 查询正常工作,将值返回到我的控制台应用程序。然后第二个查询运行,也返回请求的值,但是 then 抛出 NRE!为什么返回第三个值后它不停止对结果集的迭代?

首先,这是 XML 文件的摘录:

<analyse>
   <sample>Leer 12</sample> sample ID and number
   <id>Leer</id>    sample ID
</analyse>
<results>
   <element>
     <name>c</name>
        <value>0.000186156337031958</value>
     </element>
   <element>
     <name>co2</name>
        <value>0.000682099902270885</value>
   </element>
   <element>
     <name>s</name>
        <value>0.000121750914950204</value>
   </element>
   <element>
     <name>so3</name>
        <value>0.000304028592755094</value>
   </element>
</results>

这是第一个 LINQ 查询:

XDocument uniSample = XDocument.Load(limsfile);

        var analyse = uniSample.Descendants("analyse").Select(el => new
                                                {
                                                    Sample = el.Element("sample").Value,
                                                    Id = el.Element("id").Value
                                                });

        foreach (var el in analyse)
        {
            Console.WriteLine("Sample: " + el.Sample);
            Console.WriteLine("Sample ID: " + el.Id);
        }

这是第二个 LINQ 查询: (请注意我不得不重命名匿名类型 Value,因为它似乎与某些东西冲突)

var results = uniSample.Descendants("element").Select(elements => new 
                                                {
                                                    Name = elements.Element("name").Value,
                                                    Verdi = elements.Element("value").Value
                                                });

        foreach (var el in results)
        {
            Console.WriteLine("Name: " + el.Name);
            Console.WriteLine("Value: " + el.Verdi);
        }

现在程序的输出看起来像你期望的那样

Sample: Leer 12
Sample ID: Leer
Name: c
Value: 0.000186156337031958
Name: co2
Value: 0.000682099902270885
Name: s
Value: 0.000121750914950204
Name: so3
Value: 0.000304028592755094

...但是在第三次迭代之后,NRE 被抛出,指向后面的 LINQ 查询。为什么它不像第一次那样退出 foreach 循环??

编辑:实际上是在第四次迭代之后,抱歉混淆了! :) 谢谢!

【问题讨论】:

    标签: c# linq-to-xml


    【解决方案1】:

    查询延迟计算 - 它只会在遍历结果时执行投影。这就是为什么在它真正遇到问题元素之前你没有看到异常。要强制查询急切地求值,您可以调用ToList

    我强烈怀疑您的 element 元素缺少 namevalue 子元素,因此当您尝试取消引用该子元素的 Value 属性时,您'那时会收到NullReferenceException

    【讨论】:

    • 啊,是的,我现在看到 XML 文件中确实还有其他 元素!我只想解析那些 元素的子元素 元素,我只有一个。
    • 我不熟悉您关于强制查询热切评估的建议。你能详细说明一下吗?
    【解决方案2】:

    您的摘录运行良好。问题可能出在您的 xml 文件中的其他地方,很可能是您的某些元素没有“名称”或“值”子节点。

    【讨论】:

    • 那么我如何确保 LINQ 查询只解析 中的 元素而不解析其他任何元素?
    • 我应该提出一个新问题吗?
    【解决方案3】:

    坚持就是胜利!我最终找到了解决方案! 太骄傲了! :-)

    基本上改了两行:

    XElement uniSample = XElement.Load(limsfile);
    ...
    var results = uniSample.Element("results").Descendants("element").Select(elements => new ...
    

    所以我现在在 XElement 而不是 XDocument 中加载 XML,这让我可以更直接地查询数据..?

    然后我添加了一个调用来专门获取“结果”的后代,这就是让它在应该的时候“停止”解析的诀窍.. :-)

    感谢大家的帮助!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-21
      • 2021-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多