当你不知道结构时,通过XDocument迭代

时间:2018-02-27 20:23:51

标签: c# xml linq-to-xml xelement

当你不知道XML结构是什么时(使用c#),有没有办法迭代XDocument? 当你知道结构时有很多例子,比如这个问题的答案:C# - Select XML Descendants with LinqC# Foreach XML Node

我已经尝试了后代(“A”),其中A是下面的示例 - 在我的foreach中返回一个元素,其名称为根,值为'所有值并入一个字符串'

我这样做的原因是匿名化我知道名字的某些节点。 我正在加载的XDocument可以是任何形状 - 所以我决定只创建一个用户可以添加到包含这些敏感元素的列表。

我想避免的解决方案是用户为敏感字段创建XPath。

XML也很敏感所以我不能在字面上分享,但是一个例子(总共5个)会看起来。

   <A>
     <B>
       <C>
         <D>
           <dee>value1</dee>
           <doo>value2</doo>
           <date>value3</date>
           <time>value4</time>
         </D>
       </C>
     </B>
     <E>
       ...ommited..this doc is 5000 lines long with 500~ unique node names
     </E>
     ............
     </A>

那么有没有一种方法可以在不使用后代的情况下进行迭代?

2 个答案:

答案 0 :(得分:0)

使用.Descendants()迭代每个元素。

xmlDoc.Root.Descendants()
    .ToList()
    .ForEach(e => Console.WriteLine(e.Name));

答案 1 :(得分:0)

这就是我的方式。

后代意味着您事先了解节点的结构。即使有一个空方法调用后代(它应该从根目录获取所有东西)也没有给我我期待的东西。

下面的代码应该适用于任何XML文档,而不需要知道结构。

                XmlDocument doc = new XmlDocument();
                doc.Load(file);

                using (XmlReader reader = new XmlNodeReader(doc))
                {
                    while (reader.Read())
                    {
                        currentNodeName = reader.Name;