Search code examples
c#xmllinqlinq-to-xml

LINQ to read XML


I am using this XML file:

<root>
    <level1 name="A">
        <level2 name="A1" />
        <level2 name="A2" />
    </level1>
    <level1 name="B">
        <level2 name="B1" />
        <level2 name="B2" />
    </level1>
    <level1 name="C" />
</root>

Could someone give me a C# code using LINQ, the simplest way to print this result:
(Note the extra space if it is a level2 node)

A
  A1
  A2
B
  B1
  B2
C

Currently I have written this code:

XDocument xdoc = XDocument.Load("data.xml"));
var lv1s = from lv1 in xdoc.Descendants("level1")
           select lv1.Attribute("name").Value;

foreach (var lv1 in lv1s)
{
    result.AppendLine(lv1);
    var lv2s = from lv2 in xdoc...???
}

Solution

  • Try this.

    using System.Xml.Linq;
    
    void Main()
    {
        StringBuilder result = new StringBuilder();
    
        //Load xml
        XDocument xdoc = XDocument.Load("data.xml");
    
        //Run query
        var lv1s = from lv1 in xdoc.Descendants("level1")
                   select new { 
                       Header = lv1.Attribute("name").Value,
                       Children = lv1.Descendants("level2")
                   };
    
        //Loop through results
        foreach (var lv1 in lv1s){
                result.AppendLine(lv1.Header);
                foreach(var lv2 in lv1.Children)
                     result.AppendLine("     " + lv2.Attribute("name").Value);
        }
    
        Console.WriteLine(result);
    }