0

I want to know how I can parse this XML:

<MenuItems>
  <MenuItem Id="2" Name="Country">
    <MenuItem Id="2272" Name="Europe">
      <MenuItem Id="888" Name="Austria"/>
    </MenuItem>
    <MenuItem Id="2572" Name="Asia">
  <MenuItem Id="2572" Name="Japan"/>
    </MenuItem>
      </MenuItem>
      <MenuItem Id="3" Name="Car">
    <MenuItem Id="231" Name="Diesel">
      <MenuItem Id="387" Name="Toyota">
    <MenuItem Id="387" Name="Avensis"/>
      </MenuItem>
    </MenuItem>
  </MenuItem>
</MenuItems>

and write the following out to the console:

Country
-Europe
--Austria
-Asia
--Japan
Car
-Diesel
--Toyota
---Avensis

I don't know in advance the depth of the child in the hierarchy.

My code:

XElement doc = XElement.Parse(DataXml);
XElement MenuNode = doc.XPathSelectElement("/MenuItem");
var segmentNodes = MenuNode.XPathSelectElements("/");

foreach (XElement segmentNode in segmentNodes)
{
  var segmentAlignment = (string)segmentNode.Attribute("Name");
  Console.Writeline(segmentAlignment);
}
sam-w
  • 7,478
  • 1
  • 47
  • 77
slapyd
  • 11
  • 3

2 Answers2

0

Something like this:

using System.Xml.Linq;
using System.Xml.XPath;

. . . 

void PrintMenu(XElement menuElement, string prefix)
{
  string newPrefix = prefix + "-";
  foreach (XElement subMenuElement in menuElement.XPathSelectElements("MenuItem")) {
    Console.WriteLine(prefix+(string)subMenuElement.Attribute("Name"));
    PrintMenu(subMenuElement, newPrefix);
  }
}

. . . 

XElement doc = XElement.Parse(DataXml); 
PrintMenu(doc, String.Empty);
MiMo
  • 11,793
  • 1
  • 33
  • 48
0

This is really two questions:

  1. How to parse XML?

  2. How to traverse a recursive list of lists?

Both are trivial and sufficiently well-explained elsewhere.

Community
  • 1
  • 1
Superbest
  • 25,318
  • 14
  • 62
  • 134