2009-10-02 82 views
0

我對.NET相當陌生,對LINQ來說更是如此,對於我正在開發的一個小項目我剛剛開始探索。LINQ to XML NullReferenceException AFTER返回結果?

我有一個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查詢: (注意我是如何重新命名anonynous類型的值,因爲它似乎與某物有衝突)

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循環?

編輯:其實它是在第四次迭代後,對不起混合! :) 謝謝!

回答

0

持之以恆!我終於找到了解決方案! 很自豪! :-)

基本上改變兩行:

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

所以我現在載入了XML在的XElement而不是一個XDocument,這讓我更直接查詢數據..?

然後我說打電話來獲得的「成果」後裔明確,而且做的伎倆製造「停止」解析它要等到.. :-)

感謝您的所有幫助傢伙!

1

查詢懶惰地評估 - 它只是在執行投影時纔會執行結果。這就是爲什麼你沒有看到異常,直到它實際上碰到問題元素。要強制查詢進行熱切評估,您可以撥打ToList

我強烈懷疑,你有一個element元件,其缺少任一namevalue子元素,所以當你嘗試取消引用該子元素的Value財產,你得到一個NullReferenceException在那點。

+0

啊是的,我現在看到在XML文件中還有其他元素!我只想分析那些元素的子元素的元素,其中我只有一個元素。 – tplive 2009-10-02 12:47:30

+0

我並不熟悉您提出的有關強制查詢熱切評估的建議。你能詳細說明一下嗎? – tplive 2009-10-02 12:57:05

0

您的摘錄工作得很好。這個問題可能是你xml文件中的其他地方,最有可能的是你的一些元素沒有「name」或「value」子節點。

+0

那麼如何確保LINQ查詢僅解析中的元素,而不是其他任何其他元素? – tplive 2009-10-06 11:15:46

+0

我應該讓這是一個新問題嗎? – tplive 2009-10-06 16:22:25