Есть некий xml. В целом его структура "постоянна", но есть узлы, в которых нет части тегов, которые необходимо считать. Пример:
<row>
<name>Name 1</name>
<value>Value 1</value>
<description>Description 1</description>
</row>
<row>
<name>Name 2</name>
<value>Value 2</value>
</row>
<row>
<name>Name 3</name>
</row>
Т.е. считать не нужно поля name, value, description
Парсить пытаюсь следующим способом:
var objects = (from x in doc.Descendants("ROW")
select new
{
name = x.Elements("name").FirstOrDefault().Value,
value = x.Elements("value ").FirstOrDefault().Value,
description= x.Elements("description").FirstOrDefault().Value
}).ToList();
На выходе имею System.NullReferenceException
Думал получится по простому, но не получилось. Такая штука не проходит
description= x.Elements("description") == null ? null : x.Elements("description").FirstOrDefault().Value
Свойство Elements возвращает коллекцию элементов с указанным именем. Если таких элементов нет - возвращается пустая коллекция, а не null. Вам нужно проверять на null результат вызова FirstOrDefault(). А еще лучше использовать метод Element - он возвращает "первый (в порядке документа) дочерний элемент с указанным XName" или "null если нет элемента с указанным именем" (цитаты из MSDN). Т.е. его результат аналогичен вызову Elements("name").FirstOrDefault().
Ну и теперь можно воспользоваться оператором ?.:
name = x.Element("name")?.Value
Если тега name не окажется - в name будет записано значение null. Если вместо null вам нужно какое-то другое значение по умолчанию, то воспользуйтесь еще и оператором ??:
name = x.Element("name")?.Value ?? "(не указано)"
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости