【问题标题】:Iterate through XDocument when you dont know the structure不知道结构时遍历 XDocument
【发布时间】:2018-02-27 20:23:51
【问题描述】:

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

我已经尝试过 Descendants("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>

那么有没有办法在不使用 Descendants 的情况下进行迭代?

【问题讨论】:

  • 你可以在不提供元素名称的情况下调用Descendants(),它会遍历xml中的每一个元素。
  • 不清楚你做什么想要什么。当然,您可以使用 Elements 进行迭代(递归)。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    这就是我的做法。

    后代意味着您事先知道节点的结构。即使对后代进行空方法调用(应该从根获取所有内容)也没有给我我所期望的。

    以下代码适用于任何 XML 文档,无需了解其结构。

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

    【讨论】:

    • 所以您从 XDocument 转到 XmlDocument 并仅使用它来创建 XmlReader。直接创建该阅读器可以节省大量 RAM。
    • 我还没有找到最终的解决方案,但很可能会改变,你有权在只使用阅读器的同时将文档保存在内存中 - 注意到并且会考虑改变。我已经回答了阅读节点的最初问题。
    猜你喜欢
    • 1970-01-01
    • 2022-12-11
    • 2012-02-29
    • 1970-01-01
    • 2012-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多