Как получить более глубокие родственные файлы с помощью LINQ to XML?

#c# #linq #linq-to-xml

#c# #linq #linq-to-xml

Вопрос:

У меня есть структура XML следующим образом. Мне нужно извлечь «Значение» и «Строку», сопоставив атрибуты команды? Как написать LINQ для этого?

  <Root>
    <Command val="1001" type="sync">
      <Status>
        <DataList>
          <Info>
            <Value>1</Value>
            <String>Sample String 1 is set</String>
          </Info>
          <Info>
            <Value>2</Value>
            <String>Sample String 2 is set</String>
          </Info>
          <Info>
            <Value>3</Value>
            <String>Sample String 3 is set</String>
          </Info>
        </DataList>
      </Status>
    <Command>
</Root>
  

Я попробовал что-то, как показано ниже, но во время запуска возникло исключение.

 lst = (
    from command in xmlDoc.Descendants("Command")
        .Descendants("Status")
        .Descendants("DataList")
    select new EnumList
    {
        val = command.Element("Value").Value,
        stringVal = command.Element("String").Value,
    })
    .ToList();
  

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

1. @alex — Исключением была дополнительная информация: ссылка на объект не установлена на экземпляр объекта.

Ответ №1:

Попробуйте

 lst = (
    from command in xmlDoc.Descendants("Info")
    select new EnumList
    {
        val = command.Element("Value").Value,
        stringVal = command.Element("String").Value,
    })
    .ToList();
  

и у вас ошибка в образце xml (нет команды закрыть тег), измените ее на

     </Command>
</Root>
  

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

1. Спасибо. Это сработало. Извините, что задаю простые вопросы. Я учусь, как это сделать.

2. Как можно обеспечить условие для получения для конкретной команды, которая соответствует входным атрибутам?

3. Спасибо за поддержку. Мне удалось это написать. Я мог бы добавить условия к запросу и извлечь. Поле комментария не может содержать весь код. Итак, я не публикую.