[英]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
元素缺少name
或value
子元素,因此當您嘗試取消引用該子元素的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.