2010-05-26 27 views

Respuesta

27

pienso la manera más rápida y simple sería usar un XmlReader, esto no requiere cualquier recursión y una mínima huella de memoria.

Aquí está un ejemplo sencillo, para la compacidad que acabo de utilizar una cadena simple, por supuesto, se puede utilizar una corriente de un archivo, 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); 
    } 
    } 

El resultado de lo anterior será

parent 
child 
nested 
child 
other 

Una lista de todos los elementos en el documento XML.

33

Puede usar XmlDocument. También algo de XPath puede ser útil.

Sólo un ejemplo sencillo

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 
} 
+0

prefiere tener esto porque trata a los elementos de inicio/final y el contenido como un solo elemento, en comparación con el uso de XmlReader – Savage

13

Esto es lo que escribí rápidamente por mí mismo:

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

Para usarlo, he usado algo como:

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

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

Tal vez ayude a alguien por allí.

+2

Esto es grande! Aprendí muchísimo al recorrer este código, gracias por compartir. – reggaeguitar

+1

Enfoque generalizado. +1 Prefiero este. – Silver

2

para recorrer todos los elementos

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

prefieren usar esto sobre 'XmlDocument'. Ver: http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument (incluso más antiguo que esta pregunta aquí) –

Cuestiones relacionadas