Как использовать LINQ для разбора XML с дочерними элементами с тем же именем?

2

Фоновая информация: Раньше я собирал сборник XML файлов и повторял их через каждый XML файл, разбирал его, передавал строковые данные в объект передачи данных и передавал объект в базу данных.

До этого мой XML выглядел так.

<messages>
    <message>
        <title>Red Wall</title>
        <summary>This is a good article</summary>
        <ISBN>13546846545464</ISBN>
    </message>
</messages>

Здесь у меня есть только один элемент. Итак, я бы проанализировал XML с помощью LINQ и извлек последующие элементы (заголовок, резюме, isbn). Затем я инициализировал/создавал экземпляр объекта, присваивал его свойства полученным значениям и отправлял их.

Теперь мой XML выглядит так:

<messages>
<message>
    <title>Red Wall</title>
    <summary>This is a good article</summary>
    <ISBN>13546846545464</ISBN>
</message>

<message>
    <title>Blue Wall</title>
    <summary>This is not a good article</summary>
    <ISBN>15648465416</ISBN>
</message>
</messages>

Теперь у меня есть два (или более) элемента в моем XML файле, и для каждого из них мне нужно 1) определить, что существует несколько элементов и 2) для каждый создает отдельный DTO для хранения данных, которые я анализирую.

Мой вопрос: Как разобрать XML с несколькими тегами и идентифицировать каждый, с которым я сталкиваюсь, как отдельный от другого?

Заключительное примечание: Во время разбора мне нужно создать экземпляр DTO для захвата возвращаемой информации.

Спасибо за помощь!

  • 0
    Для каждого файла вам нужно определить, имеет ли он несколько элементов, прежде чем пытаться его проанализировать?
Теги:
linq

2 ответа

2
Лучший ответ

Просто возьмите элемент, который вы хотите, и используйте свой выбор, чтобы заполнить dto из дочерних элементов. Что-то вроде этого не проверено

XElement ele = loaded.Element("messages");    
dtos = from item in ele.Descendants("message")
    select new DTO() {title = item.Element(title).value ,... };
  • 0
    Я новичок в LINQ. Не знал, что вы можете создать экземпляр с помощью оператора select. Sexy. Тогда для каждого сообщения: как добавить DTO в список? Мне нужно создать список DTO для каждого файла и вернуть его в метод, который попадает в БД. В очередной раз благодарим за помощь.
  • 1
    @fullNelson: приведенный выше код добавляет каждый DTO в коллекцию IEnumerable dtos . Вы можете .ToList() вызывать .ToList() , .ToArray() т.д. для этого объекта
Показать ещё 7 комментариев
0

Вышеприведенный оператор вернет IEnumerable <DTO> , который представляет собой последовательность объектов DTO. Для каждого сообщения node, которое он находит в XML, он создаст объект DTO и добавит его в возвращаемую последовательность. Если ваша цель - просто перебрать все DTO, вы уже там. Если вам действительно нужен List <DTO> , есть конструктор в общем объекте List, который принимает IEnumerable <T> , поэтому вы можете передать "dtos", который вы получили из оператора select, и иметь список.

  • 0
    У меня есть этот код сейчас, и кажется, что мой список отзывов является нулевым, когда он достигает оператора возврата. Я что-то упустил, что вы здесь говорите? XElement root = XElement.Load(fileInProcessingName); var dtos = from item in root.Descendants("message") select new ReviewDTC() { Summary = item.Element("summary").Value , Isbn = item.Element("ISBN").Value , PubDate = item.Element("PublicationDate").Value }; List<ReviewDTC> reviews = dtos.ToList<ReviewDTC>(); return reviews; }
  • 0
    похоже, что вы на самом деле не передаете значения из item.Element(..).Value в конструктор для ReviewDTC . Прежде чем вызвать List<ReviewDTC> reviews = dtos.ToList<ReviewDTC> взгляните на IEnumerable reviews в точке останова и посмотрите, не заполняется ли он, как вы ожидаете.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню