Traverse a XML using Recursive function
Asked Answered
C

3

9

How can I traverse (read all the nodes in order) a XML document using recursive functions in c#?

What I want is to read all the nodes in xml (which has attributes) and print them in the same structure as xml (but without Node Localname)

Thanks

Centri answered 20/10, 2009 at 17:34 Comment(2)
I still don't understand what you really want to do. Can you maybe show a very simple and short example? What does your original XML look like, what do you want back? What do you mean by "print them" - write to the console? Write to a file? And shouldn't you be looking at XSLT for converting from XML to XML? Seems like a perfect fit.Immunochemistry
I agree XSLT is the best 1..but here i expected a simple recursive algo..thnx anywayCentri
N
33
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 );
            }
        }
    }
}
Nygaard answered 20/10, 2009 at 18:37 Comment(1)
If this solved your problem, can you mark it as the correct answer? Thanks.Nygaard
F
4
IEnumerable<atype> yourfunction(XElement element)
{
    foreach(var node in element.Nodes)
   {
      yield return yourfunction(node);
   }

//do some stuff
}
Flossi answered 20/10, 2009 at 17:37 Comment(4)
i think my question in not giving enough explanation.What i want is, want to read all the nodes in xml(which has attributes) and print it in the same structure as xml(but without Node Localname)Centri
the return prevents the loop from, er, looping.Landes
@Landes : have a look at the "yield return" instruction : msdn.microsoft.com/en-us/library/9k7k7cf0.aspxBaguette
@Seb: it my fault, I had forgotten the yield before :)Flossi
F
2

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);
}
Fowlkes answered 4/5, 2015 at 4:37 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.