web-dev-qa-db-fra.com

Itération à travers tous les nœuds dans un fichier XML

Je veux parcourir tous les nœuds d'un fichier XML et imprimer leurs noms. Quelle est la meilleure façon de procéder? J'utilise .NET 2.0.

31
Night Walker

Je pense que le moyen le plus rapide et le plus simple serait d'utiliser un XmlReader , cela ne nécessitera aucune récursivité et une empreinte mémoire minimale.

Voici un exemple simple, pour plus de compacité, je viens d'utiliser une chaîne simple bien sûr, vous pouvez utiliser un flux à partir d'un fichier, etc.

  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);
    }
  }

Le résultat de ce qui précède sera

parent
child
nested
child
other

Une liste de tous les éléments du document XML.

36
Chris Taylor

Vous pouvez utiliser XmlDocument . Certains XPath peuvent également être utiles.

Juste un exemple simple

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
}
44
Incognito

Voici ce que j'ai rapidement écrit pour moi:

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);
        }
    }
}

Pour l'utiliser, j'ai utilisé quelque chose comme:

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

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

Peut-être que cela aide quelqu'un là-bas.

16
Uwe Keim

Pour parcourir tous les éléments

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