Построение списка объектов с помощью Linq to Xml

#xml #linq

#xml #linq

Вопрос:

Я пытаюсь извлечь значения из XML-файла, используя linq для создания списка объектов. XML-файл выглядит следующим образом.

 <RootNode>
  <Node1>
     <Node2>
        <results>
           <work>
              <title>title1</title>
              <author>author</author>
              <image_url>image</image_url>
            </work>
    ...
</RootNode>

XDocument results = XDocument.Load("url");
  

В зависимости от поиска может быть несколько вхождений этих «рабочих» узлов (и последующих дочерних узлов). Для каждого вхождения ‘work’ я хочу извлечь значения title / author / image для создания простого объекта book:

 public class Book
{
    public string Title { get; set; }
    public string Author { get; set; }
    public string ImageUrl { get; set; }
}
  

Теперь я могу перебирать XML-файл и выбирать отдельные значения, используя что-то вроде этого:

 foreach (XElement element in results.Descendants("title"))
{
    string title = element.Value;
}
  

но поскольку я хочу создать список книг, я пробовал разные вещи, очень похожие на это:

 List<Book> books = 
    (from book in results.Descendants("work")
            select new Book
            {
                Title = book.Element("title").Value,
                Author = book.Element("name").Value,
                ImageUrl = book.Element("image_url").Value,
            }).ToList<Book>();
  

Однако я продолжаю получать исключение с нулевой ссылкой для этого. Любые указания на то, где я ошибаюсь, были бы весьма признательны.

Кевин.

Редактировать

Привет, ребята, оказывается, проблема была в XML-файле, а не в инструкции linq. Спасибо.

Ответ №1:

У меня это работает после нескольких незначительных изменений:

     var books = (from book in results.Descendants("work")
        select new Book
                {
                    Title = book.Element("title").Value,
                    Author = book.Element("author").Value,
                    ImageUrl = book.Element("image").Value,
                }).ToList();
  

Комментарии:

1. Привет, спасибо за ваш ответ. Да, то, что у меня есть, выглядит правильным для меня, однако я продолжаю получать это исключение с нулевой ссылкой, которое не было обработано пользователем. Это очень странно, поскольку я могу точно выделить один элемент, как показано в цикле foreach.

Ответ №2:

Под нулевым значением вы подразумеваете исключение нулевой ссылки? Я вижу, что в вашем коде вы ищете элемент «image_url», но в вашем примере есть элемент «image».