【问题标题】:list all tags in XML with LINQ使用 LINQ 列出 XML 中的所有标签
【发布时间】:2015-05-10 06:44:36
【问题描述】:

我正在尝试读取各种类型的 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 获得这样的结果?

【问题讨论】:

标签: c# xml linq xml-parsing


【解决方案1】:

嗯,你可以使用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);
}

【讨论】:

  • 嗨@Jon Skeet,有没有办法列出所有路径的节点,如'ITEMS.ITEM.CODE'?
  • @ARIFYILMAZ:列出哪些节点?不清楚你的意思。如果您的意思是您希望每一行有效地包含您如何到达该元素的层次结构,那么是的,这绝对是可能的。我刚刚想到了一种更简单的方法来实现GetDepth,顺便说一句...
  • 我需要让一个子节点使用完整路径打印出来,例如“//Root//Child//Child”。有意义吗
  • @ARIFYILMAZ:是的——我建议你看看Ancestors 方法,结合Reverse()string.Join。如果这对您没有帮助,最好再问一个问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-21
相关资源
最近更新 更多