Почти наверняка отсутствует один из ожидаемых вами элементов.
Если вы запустите его в отладчике, вы можете обнаружить, что, когда оно выдает исключение, оно указывает на то, какая фактическая операция включена, что сделает его намного проще.
В качестве альтернативы разбейте анализ отдельных компонентов на отдельные методы:
this.Subforums = subforumsXML.Descendants("forum")
.Select(ParseForum)
.ToList();
...
static SubForum ParseForum(XElement forum)
{
return new Subforum
{
ID = forum.Element("id").Value,
...
LastPost = ParseLastPost(forum.Element("lastpost"))
};
}
static LastPost ParseLastPost(XElement lastPost)
{
...
}
Я обнаружил, что это может сделать выражения запросов более управляемыми.
Один из способов избежать NRE, когда есть пропущенный элемент, значение которого вы просто пытаетесь получить, - это использовать преобразование вместо свойства Value
, например,
ID = (string) forum.Element("id")
Это установит ID на null
, если элемент id
отсутствует. Очевидно, что если на самом деле это обязательное свойство , генерировать исключение лучше, но для дополнительных свойств это действительно полезно.