2011-02-01 3 views
1

실행될 때 NullReferenceException을 생성하는 XML 데이터 집합에 대한 linq 쿼리가 있습니다.linq NullReferenceException 질문

XDocument dataDoc = XDocument.Load (새 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 속성이 없기 때문에.
Attribute이 아니라 Element으로 전화해야합니다.

편집 : dataDoc.Descendants("genres")을 호출하면 <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을 문자열에 캐스트하는 경우 원래 참조가 null 인 경우 예외가 throw되는 것이 아니라 결과가 null이됩니다. Value 캐스팅을 사용할 필요가 없습니다.