2011-02-01 54 views
1

我有一個XML數據集的LINQ查詢,它在執行時產生一個NullReferenceException。linq NullReferenceException問題

XDocument dataDoc = XDocument.Load(new StringReader(e.Result));

var Genres = from genre in dataDoc.Descendants("genres") 
    where (!genre.Element("ID").IsEmpty) 
    select (string)genre.Element("id").Value + ',' + (string)genre.Attribute("name").Value + ',' + (string)genre.Attribute("url").Value; 

foreach (string myGenre in Genres) 
{ 
} 

執行時,LINQ查詢工作正常,但是當代碼試圖通過foreach循環迭代時,NullReferenceException異常發生。現在

,我認爲這個問題與XML數據我讀,它看起來像下面這樣做:

<genres> 
    <translated>true</translated> 
    <genre name="1"> 
    <id>28</id> 
    <url>http://url1</url> 
    </genre> 
    <genre name="2"> 
    <id>12</id> 
    <url>http://url2</url> 
    </genre> 
</genres> 

是第一個子節點,其結構不同,造成問題? 我身後這個類不應該是一個問題,但以下(以防萬一):

public class Genre 
{ 
    public string ID { get; set; } 
    public string Name { get; set; } 
    public string URL { get; set; } 
} 
+0

你的where子句可能應該是小寫。 – SLaks 2011-02-01 17:00:45

回答

3

genre.Attribute("url")回報null,因爲沒有url屬性。
您需要致電Element,而不是Attribute

編輯:調用dataDoc.Descendants("genres")返回單個<genres>元素,這不是你想要的。
您需要致電Descendants("genre")(單數)以獲得個人<genre ...>元素。
您也可以撥打dataDoc.Descendants("genres").Elements來獲取<genres>元素中的元素。

+0

好的。我做了(骨頭錯誤)更正,但我仍然得到相同的結果。我也刪除了where子句,沒有任何區別。 – pearcewg 2011-02-01 17:06:11

1

SLaks指出了使用Attribute而不是Element的錯誤,但是您可以在代碼中進行另一項改進。目前您正在使用Value屬性,然後冗餘地轉換爲字符串。如果你只是XAttributeXElement轉換爲字符串,那麼如果原始引用爲null,那麼結果也將爲null,而不是拋出異常。使用Value鑄件沒有意義。