Как вывести определенные узлы XML?

234
03 января 2018, 16:36

Нужно вывести дочерние узлы определенного узла. Вот xml документ:

<?xml version="1.0" encoding="UTF-8"?>
<head>
  <Klassi>
    <klass>
      Класс 1
      <klass Attr="Класс 15">Класс 15</klass>
      <klass Attr="Класс 15">Класс 15</klass>
    </klass>
    <klass>Класс 2</klass>
    <klass>Класс 3</klass>
    <klass>Класс 4</klass>
    <klass>Класс 5</klass>
    <klass>
      Класс 15
      <gruppa>А</gruppa>
      <gruppa>Б</gruppa>
      <gruppa>В</gruppa>
    </klass>
    <klass>
      Класс 9
      <gruppa>А</gruppa>
    </klass>
    <klass Attr="Класс 777">
      Класс 777
      <gruppa>А</gruppa>
      <gruppa>Б</gruppa>
      <gruppa>В</gruppa>
    </klass>
  </Klassi>
</head>

Мне нужно вывести дочерние узлы, ну например, элемента 'Класс 15'. Т.е. в данном случае я хочу получить список вот таких значений: А Б В. Так вот как это сделать?

Answer 1

Ну можно пройтись по дереву и выбрать те элементы klass, которые содержат текст "Класс 15". Давайте воспользуется Linq2Xml:

var doc = XDocument.Load("file.xml");  // Загружаем документ
var klass15 = doc.Element("head")    // Берем элемент head
                 .Element("Klassi")  // В нем элемент Klassi
                 .Elements("klass")  // В нем все элементы klass
// Из них выбираем те, которые содержат текст и этот текст содержит строку "Класс 15"
                 .Where(e => e.Nodes()
                              .OfType<XText>()
                              .Where(t => t.Value.Contains("Класс 15")).Any());
foreach (var e in klass15.Elements("gruppa"))  // Пройдемся по его элементам gruppa
    Console.WriteLine(e.Value);  // И выведем их содержимое

Вывод:

А
Б
В
READ ALSO
Начало цикла с новый данных

Начало цикла с новый данных

Есть 3 цикла от 000 до 999, в коде прописано что если число, к примеру доходит до 193, то он дальше не идет(194,

236
Просмотр пользователя из базы

Просмотр пользователя из базы

ЗдравствуйтеОсваиваем asp

272
Быстрый по объекту JS

Быстрый по объекту JS

Как получить необходимые значения без миллиона вложенных for (key in data) {}

295