使用LINQ列出XML格式的所有标签

时间:2015-05-10 06:44:37

标签: c# xml linq xml-parsing

我正在尝试阅读各种类型的XML文件,并且在每个xml类型中,根名称和所有其他标记可能会更改。我需要列出所有的xml标签,但我无法成功阅读。

这是xml类型之一。

<?xml version="1.0" encoding="ISO-8859-9"?>
<ITEMS>
   <ITEM DBOP="INS" >
      <CARD_TYPE>11</CARD_TYPE>
      <CODE>MALZ1</CODE>
      <NAME>MALZ1</NAME>
   </ITEM>
 </ITEMS>

还有另外一个

<?xml version="1.0" encoding="ISO-8859-9"?>
<CLCARDS>
   <CLCARD DBOP="INS" >
      <CARD_TYPE>11</CARD_TYPE>
      <CODE>CLCARD1</CODE>
      <NAME>CLCARD1</NAME>
   </CLCARD>
 </CLCARDS>

我尝试了下面的代码,但没有列出所有

string xml = txtXml.Text;
XDocument xdoc = XDocument.Parse(xml);

txtResult.Text = xdoc.Root.Name.ToString() + Environment.NewLine;
foreach (XElement element in xdoc.Elements())
    txtResult.Text += element.Name.ToString() + Environment.NewLine;

它刚刚列出了第一个xml的标签

items
items

我想列出如下

items
  item
    card_type
    code
    name

如何用LINQ获得这样的结果?

1 个答案:

答案 0 :(得分:3)

嗯,您可以使用Descendants()方法获取所有元素:

foreach (var element in xdoc.Descendants())
{
    Console.WriteLine(element.Name);
}

然而,这不会做任何缩进。如果你想要缩进,你可以使用类似的东西:

public static int GetDepth(XElement element)
{
    return element.Ancestors().Count();
}

然后:

foreach (var element in xdoc.Descendants())
{
    Console.WriteLine("{0}{1}",
        new string(' ', GetDepth(element)),
        element.Name);
}