@Stels007

C# Xml Как занести в массив соответствующие элементы дерева?

Здравствуйте! Не могу решить навязчивую проблему. Дана структура дерева:
<head>
<block1>
 <block_header></block_header>
 <block_picture></block_picture>
 <block_text></block_text>
</block1>
<block2></block2>
<block3>
 <block_header></block_header>
 <block_picture></block_picture>
 <block_text></block_text>
</block3>
</head>

Как занести в массив или получить значение именно элементы block1, block2 и block3, не обращаясь к дочерним?
  • Вопрос задан
  • 465 просмотров
Решения вопроса 1
AlekseyNemiro
@AlekseyNemiro
full-stack developer
Взять head и перебирать дочерние узлы, которые можно найти в свойстве ChildNodes:
var xml = @"<head>
<block1>
 <block_header></block_header>
 <block_picture></block_picture>
 <block_text></block_text>
</block1>
<block2></block2>
<block3>
 <block_header></block_header>
 <block_picture></block_picture>
 <block_text></block_text>
</block3>
</head>";

var doc = new XmlDocument();
doc.LoadXml(xml);

var head = doc.SelectSingleNode("/head");

var list = new List<string>();

foreach (XmlNode node in head.ChildNodes)
{
  list.Add(node.Name);
  // node.InnerXml - содержимое узла
  Console.WriteLine("{0}={1}", node.Name, node.InnerXml);
}

// в коллекции list будет список имен дочерних узлов корневого узла

Всех детей, при необходимости, можно перебрать рекурсией, или с помощью стека:

var doc = new XmlDocument();
// определение переменной xml см. в предыдущем коде
doc.LoadXml(xml);

// создаем стек
var stack = new Stack<XmlNode>();

// добавляем в стек корневой элемент
stack.Push(doc.SelectSingleNode("/head"));

// var list = new List<string>();

// перебираем все элементы стека
while(stack.Count > 0)
{
  // берем верхний элемент и удаляем его и стека
  var node = stack.Pop();

  // выводим
  // если требуется, можно добавить в коллекцию
  // list.Add(node.Name);
  Console.WriteLine("Node: {0}, childs: {1}", node.Name, node.ChildNodes.Count);

  Console.WriteLine(node.InnerXml);

  // если есть дети, добавляем их в стек
  if (node.ChildNodes.Count > 0)
  {
    // берем с конца, чтобы сохранить порядок
    for (int i = node.ChildNodes.Count - 1; i >= 0; --i)
    {
      stack.Push(node.ChildNodes[i]);
    }
  }
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы