2009-10-20 86 views
6

¿Cómo puedo recorrer (leer todos los nodos en orden) un documento XML que utiliza funciones recursivas en C#?Recorrer un XML utilizando la función recursiva

Lo que quiero es leer todos los nodos en XML (que tiene atributos) e imprimirlos en la misma estructura como XML (pero sin Nodo localName)

Gracias

+1

Todavía no entiendo lo que realmente quiere hacer. ¿Puedes mostrar un ejemplo muy simple y breve? ¿Cómo es tu XML original? ¿Qué quieres de nuevo? ¿Qué quiere decir con "imprimirlos" - escribir en la consola? Escribir en un archivo? ¿Y no debería estar mirando XSLT para convertir de XML a XML? Parece un ajuste perfecto. –

+0

Estoy de acuerdo XSLT es el mejor 1..pero aquí esperaba un algo recursivo ... de todos modos – Kaja

Respuesta

3
IEnumerable<atype> yourfunction(XElement element) 
{ 
    foreach(var node in element.Nodes) 
    { 
     yield return yourfunction(node); 
    } 

//do some stuff 
} 
+0

creo que mi pregunta es no dar suficiente explicación. Lo que quiero es, quiero leer todos los nodos en xml (que tiene atributos) e imprímalo en la misma estructura que xml (pero sin nombre local del nodo) – Kaja

+0

el retorno evita que el bucle entre, por ejemplo, el bucle. – bmm6o

+0

@ bmm6o: eche un vistazo a la instrucción de "rendimiento devuelto": http://msdn.microsoft.com/en-us/library/9k7k7cf0.aspx – Seb

22
using System.Xml; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var doc = new XmlDocument(); 
      // Load xml document. 
      TraverseNodes(doc.ChildNodes); 
     } 

     private static void TraverseNodes(XmlNodeList nodes) 
     { 
      foreach(XmlNode node in nodes) 
      { 
       // Do something with the node. 
       TraverseNodes(node.ChildNodes); 
      } 
     } 
    } 
} 
+0

thanx ... esto resolvió el problema – Kaja

+19

Si esto resolvió su problema, ¿puede marcarlo como la respuesta correcta? Gracias. –

1

Here's a good example

static void Main(string[] args) 
{ 
    XmlDocument doc = new XmlDocument(); 
    doc.Load("../../Employees.xml"); 
    XmlNode root = doc.SelectSingleNode("*"); 
    ReadXML(root); 
} 

private static void ReadXML(XmlNode root) 
{ 
    if (root is XmlElement) 
    { 
     DoWork(root); 

     if (root.HasChildNodes) 
      ReadXML(root.FirstChild); 
     if (root.NextSibling != null) 
      ReadXML(root.NextSibling); 
    } 
    else if (root is XmlText) 
    {} 
    else if (root is XmlComment) 
    {} 
} 

private static void DoWork(XmlNode node) 
{ 
    if (node.Attributes["Code"] != null) 
     if(node.Name == "project" && node.Attributes["Code"].Value == "Orlando") 
      Console.WriteLine(node.ParentNode.ParentNode.Attributes["Name"].Value); 
} 
Cuestiones relacionadas