2011-02-01 6 views
1

У меня есть запрос linq к набору данных XML, который при выполнении генерирует исключение NullReferenceException.linq NullReferenceException question

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 работает нормально, но когда код пытается итерации цикла Еогеасп, происходит 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

ответ

3

genre.Attribute("url") возвращается null, так как нет url атрибута.
Вам необходимо позвонить по телефону Element, а не Attribute.

EDIT: Вызов dataDoc.Descendants("genres") возвращает единственный <genres> элемент, который не то, что вы хотите.
Для получения отдельных лиц необходимо ввести Descendants("genre") (особые) изделия.
Вы также можете позвонить dataDoc.Descendants("genres").Elements, чтобы получить элементы внутри элемента <genres>.

+0

Хороший улов. Я сделал исправление (головокружение), но я все равно получаю тот же результат. Я также удалил предложение where без каких-либо различий. – pearcewg

+0

@pearcewg: Смотрите мое редактирование. – SLaks

+0

Ага! Редактирование было разницей! Я думаю, мне нужно потратить некоторое время на качественное обучение, а не только основы Linq. Очень полезная технология. Спасибо вам за помощь! – pearcewg

1

SLaks указал на ошибку при использовании атрибута, а не элемента, но есть еще одно улучшение, которое вы можете внести в свой код. В настоящее время вы используете свойство Value, а затем избыточно бросаете строку. Если вы просто, введите XAttribute или XElement в строку, то если исходная ссылка равна NULL, результат будет также нулевым, а не исключение. Нет смысла использовать Valueи литье.