簡體   English   中英

LINQ to XML NullReferenceException返回結果之后?

[英]LINQ to XML NullReferenceException AFTER returning the results?

我對.NET還是個新手,對於LINQ來說更是如此。我剛剛開始探索我正在從事的一個小型項目。

我有一個從應用程序生成的XML文件,該文件包含一些要解析為專有格式並保存在文件中的值。

我能夠使一個LINQ查詢正常工作,將值返回到我的控制台應用程序。 然后第二個查詢運行,還返回請求的值,但隨后拋出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循環?

編輯:實際上是在第四次迭代之后,對不起混淆! :) 謝謝!

該查詢懶惰地求值-在通過結果時只會執行投影。 這就是為什么您直到真正遇到問題元素才看到異常。 要強制對查詢進行快速評估,可以調用ToList

我強烈懷疑您的element元素缺少namevalue子元素,因此當您嘗試取消引用該子元素的Value屬性時,此時會得到NullReferenceException

您的摘錄工作正常。 問題可能出在xml文件中的其他地方,並且很可能是您的某些元素沒有“名稱”或“值”子節點。

堅持不懈! 我終於找到了解決方案! 太驕傲了! :-)

基本上改變了兩行:

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

因此,我現在將XML加載到XElement中而不是XDocument中,這使我可以更直接地查詢數據。

然后,我添加了一個調用來專門獲取“結果”的后代,並且這樣做的竅門是使它在應有的情況下“停止”解析.. :-)

感謝您的幫助!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM