Я хочу перебирать все узлы в файле XML и печатать их имена. Каков наилучший способ сделать это? Я использую .NET 2.0.
Итерация по всем узлам в файле XML
Ответ 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...
});
Может быть, это помогает кому-то там.
Ответ 4
Рекурсивный алгоритм, который анализирует через XmlDocument
Вот пример - Рекурсивное чтение XML-документа и использование regex для получения содержимого
Вот еще один рекурсивный пример - http://www.java2s.com/Tutorial/CSharp/0540__XML/LoopThroughXmlDocumentRecursively.htm l
Ответ 5
Чтобы выполнить итерацию всех элементов
XDocument xdoc = XDocument.Load("input.xml");
foreach (XElement element in xdoc.Descendants())
{
Console.WriteLine(element.Name);
}