Подтвердить что ты не робот

Итерация по всем узлам в файле XML

Я хочу перебирать все узлы в файле XML и печатать их имена. Каков наилучший способ сделать это? Я использую .NET 2.0.

4b9b3361

Ответ 1

Я думаю, что самым быстрым и простым способом было бы использовать XmlReader, это не потребует какой-либо рекурсии и минимальной печати в памяти.

Вот простой пример: для компактности я просто использовал простую строку, конечно, вы можете использовать поток из файла и т.д.

  string xml = @"
    <parent>
      <child>
        <nested />
      </child>
      <child>
        <other>
        </other>
      </child>
    </parent>
    ";

  XmlReader rdr = XmlReader.Create(new System.IO.StringReader(xml));
  while (rdr.Read())
  {
    if (rdr.NodeType == XmlNodeType.Element)
    {
      Console.WriteLine(rdr.LocalName);
    }
  }

Результат выше будет

parent
child
nested
child
other

Список всех элементов в документе XML.

Ответ 2

Вы можете использовать XmlDocument. Также полезно использовать некоторые XPath.

Простой пример

XmlDocument doc = new XmlDocument();
doc.Load("sample.xml");
XmlElement root = doc.DocumentElement;
XmlNodeList nodes = root.SelectNodes("some_node"); // You can also use XPath here
foreach (XmlNode node in nodes)
{
   // use node variable here for your beeds
}

Ответ 3

Вот что я быстро написал для себя:

public static class XmlDocumentExtensions
{
    public static void IterateThroughAllNodes(
        this XmlDocument doc, 
        Action<XmlNode> elementVisitor)
    {
        if (doc != null && elementVisitor != null)
        {
            foreach (XmlNode node in doc.ChildNodes)
            {
                doIterateNode(node, elementVisitor);
            }
        }
    }

    private static void doIterateNode(
        XmlNode node, 
        Action<XmlNode> elementVisitor)
    {
        elementVisitor(node);

        foreach (XmlNode childNode in node.ChildNodes)
        {
            doIterateNode(childNode, elementVisitor);
        }
    }
}

Чтобы использовать его, я использовал что-то вроде:

var doc = new XmlDocument();
doc.Load(somePath);

doc.IterateThroughAllNodes(
    delegate(XmlNode node)
    {
        // ...Do something with the node...
    });

Может быть, это помогает кому-то там.

Ответ 5

Чтобы выполнить итерацию всех элементов

XDocument xdoc = XDocument.Load("input.xml");
foreach (XElement element in xdoc.Descendants())
{
    Console.WriteLine(element.Name);
}