2010-05-26 21 views

risposta

27

penso il modo più semplice e veloce sarebbe quello di usare uno XmlReader, questo non richiede qualsiasi ricorsione e minima impronta di memoria.

Ecco un semplice esempio, per la compattezza ho solo usato una semplice stringa, naturalmente, è possibile utilizzare un flusso da un file ecc

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

Il risultato di quanto sopra sarà

parent 
child 
nested 
child 
other 

Un elenco di tutti gli elementi nel documento XML.

33

È possibile utilizzare XmlDocument. Anche alcuni XPath possono essere utili.

Basta un semplice esempio

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

preferiscono questo perché tratta gli elementi/inizio fine e il contenuto come un singolo elemento, rispetto all'utilizzo di XmlReader – Savage

13

Questo è ciò che ho scritto in fretta per me: qualcosa

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

Per usarlo, ho usato come:

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

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

Forse aiuta qualcuno là fuori.

+2

Questo è grande! Ho imparato un sacco passando questo codice, grazie per la condivisione. – reggaeguitar

+1

Approccio generalizzato. +1 Preferisco questo. – Silver

2

per scorrere tutti gli elementi

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

preferisci usare questo sopra 'XmlDocument'. Vedi: http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument (anche più vecchio di questa domanda qui) –

Problemi correlati