2009-10-20 11 views
6

Comment puis-je parcourir (lire tous les nœuds dans l'ordre) un document XML en utilisant des fonctions récursives dans C#?Traverser un XML en utilisant la fonction Recursive

Ce que je veux est de lire tous les noeuds XML (qui a des attributs) et les imprimer dans la même structure que xml (mais sans nœud LocalName)

Merci

+1

Je ne comprends toujours pas ce que vous voulez vraiment faire. Pouvez-vous montrer un exemple très simple et court? À quoi ressemble votre XML original, que voulez-vous de retour? Que voulez-vous dire par "les imprimer" - écrire sur la console? Écrire dans un fichier? Et ne devriez-vous pas regarder XSLT pour la conversion de XML en XML? On dirait un ajustement parfait. –

+0

Je suis d'accord XSLT est le meilleur 1..but ici, je m'attendais à un simple algo récursif..thnx de toute façon – Kaja

Répondre

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

//do some stuff 
} 
+0

je pense que ma question en ne donnant pas assez d'explications.Que je veux, je veux lire tous les nœuds en XML (qui a des attributs) et l'imprimer dans la même structure que xml (mais sans Node Localname) – Kaja

+0

le retour empêche la boucle de, er, en boucle. – bmm6o

+0

@ bmm6o: jetez un oeil à l'instruction "yield return": 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..ce qui a résolu le prob – Kaja

+19

Si cela a résolu votre problème, pouvez-vous le marquer comme la bonne réponse? Merci. –

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