LINQ to XML: парсинг xml с отсутствующими тегами

219
27 февраля 2018, 02:35

Есть некий 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
Answer 1

Свойство 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 ?? "(не указано)"
READ ALSO
C# double. Округление

C# double. Округление

если число меньше какого то значения "00000002", то C# превращает его в 2e-07

259
SQLite.Interop.dll. Не удается загрузить

SQLite.Interop.dll. Не удается загрузить

Доброе утроУ меня вопрос

273
Как реализовать Generating path в Unity?

Как реализовать Generating path в Unity?

Нужно реализовать генерацию пути с развилкой (то что нужно мне указано на изображении)

211
Узнать какая кнопка была нажата UWP

Узнать какая кнопка была нажата UWP

Есть некоторый набор кнопок на странице, которые привязаны с одному методу ViewModel:

256