2010-05-26 7 views

Antwort

27

Ich denke, der schnellste und einfachste Weg wäre, eine XmlReader zu verwenden, wird dies nicht erfordern eine Rekursion und minimalen Speicherbedarf.

Hier ist ein einfaches Beispiel für Kompaktheit habe ich nur einen einfachen String natürlich Sie einen Stream aus einer Datei usw.

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

Das Ergebnis der oben wird

parent 
child 
nested 
child 
other 

sein verwenden können

Eine Liste aller Elemente im XML-Dokument.

33

Sie können XmlDocument verwenden. Auch einige XPath können nützlich sein.

nur ein einfaches Beispiel

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

dies durch alle Elemente iterieren bevorzugen, weil es den Start/End-Elemente und Inhalt als ein einzelnes Element behandelt, im Vergleich zur Verwendung XmlReader – Savage

13

Dies ist, was ich für mich schnell geschrieben:

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

, es zu benutzen, habe ich verwendet, so etwas wie:

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

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

Vielleicht hilft es jemand da draußen.

+2

Das ist großartig! Ich habe eine Menge gelernt, indem ich diesen Code durchgegangen bin, danke fürs Teilen. – reggaeguitar

+1

Verallgemeinerter Ansatz. +1 Ich bevorzuge diesen. – Silver

2

Um

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

bevorzugen, diese über 'XmlDocument' zu verwenden. Siehe: http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument (sogar älter als diese Frage hier) –