2010-05-26 12 views

Odpowiedz

27

myślę najszybszym i najprostszym sposobem byłoby użycie XmlReader, to nie będzie wymagają dowolnej rekurencji i minimalnego wydruku stopki pamięci.

Oto prosty przykład, dla zwięzłości używałem prosty ciąg oczywiście można użyć strumienia z pliku itp

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

Wynikiem powyższego będzie

parent 
child 
nested 
child 
other 

Lista wszystkich elementów w dokumencie XML.

33

Można użyć XmlDocument. Również niektóre XPath mogą być przydatne.

Wystarczy prosty przykład

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

wolą to dlatego, że traktuje start/końcowe elementy i treści w jednej pozycji, w porównaniu z użyciem XmlReader – Savage

13

To właśnie szybko napisał dla siebie:

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

Aby go użyć, Użyłem coś takiego:

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

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

Może to pomaga kogoś tam.

+2

To jest świetne! Nauczyłem się tony, przechodząc przez ten kod, dziękując za dzielenie się. – reggaeguitar

+1

Uogólnione podejście. +1 Wolę ten. – Silver

2

iterację wszystkich elementów

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

preferuję używanie tego przez 'XmlDocument'. Zobacz: http://stackoverflow.com/questions/1542073/xdocument-or-xmldocument (nawet starsze niż to pytanie tutaj) –

Powiązane problemy