2011-02-01 17 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が発生します。

<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> 

は構造が異なる最初の子ノードであり、原因:

さて、私は、問題は、次のようになります。私が読んでいるXMLデータに関係していることをを考える問題? この背後にある私のクラスは問題ではありませんが、(念のため)以下の通りです:

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

あなたの 'where'節はおそらく小文字であるべきです。 – SLaks

答えて

3

genre.Attribute("url")戻りnull、何url属性が存在しないため。
ではなく、Elementに電話する必要があります。

EDITdataDoc.Descendants("genres")を呼び出すと、1つの<genres>要素が返されますが、これは必要ではありません。
個々の<genre ...>要素を取得するには、Descendants("genre")(単数)に電話する必要があります。
dataDoc.Descendants("genres").Elementsを呼び出して、<genres>要素内の要素を取得することもできます。

+0

良いキャッチ。私はそれを骨折したミスを修正しましたが、私はまだ同じ結果を得ています。私はwhere節も削除しましたが、違いはありません。 – pearcewg

+0

@pearcewg:私の編集を参照してください。 – SLaks

+0

ああ!編集は違いでした!私は、Linqの基本だけでなく、より良い学習をするために、良質な時間を過ごす必要があると思います。非常に有用な技術。お手伝いありがとう! – pearcewg

1

SLaksは、ElementではなくAttributeを使用している間違いを指摘していますが、コードに改善を加えることができます。現在、Valueプロパティを使用していて、重複して文字列にキャストしています。 XAttributeまたはXElementをstringにキャストすると、元の参照がnullの場合、例外がスローされるのではなく、結果もnullになります。 Valueキャスティングの使用には意味がありません。