Взять
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]);
}
}
}