S
S
Stels0072018-06-30 19:32:50
C++ / C#
Stels007, 2018-06-30 19:32:50

C# Xml How to array corresponding tree elements?

Hello! I can't solve the annoying problem. Given the tree structure:

<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>

How to enter into an array or get the value exactly the elements block1, block2 and block3, without referring to the children?

Answer the question

In order to leave comments, you need to log in

1 answer(s)
A
Alexey Nemiro, 2018-06-30
@Stels007

Take head and iterate over the child nodes that can be found in the ChildNodes property :

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 будет список имен дочерних узлов корневого узла

All children, if necessary, can be sorted out by recursion, or using a stack:
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]);
    }
  }
}

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question