【问题标题】:Parsing XML with duplicate root elements解析具有重复根元素的 XML
【发布时间】:2012-06-21 07:07:32
【问题描述】:

我正在尝试以编程方式清除具有 C# .NET 4.0 中重复根元素的无效 XML。我想要做的是将所有内部元素合并为一个根元素并删除重复的根,以便

<a>
    <b></b>
</a>
<a>
    <c></c>
</a>

变成

<a>
    <b></b>
    <c></c>
</a>

但是,重复的根元素也可能出现在内部 XML 中。在这种情况下,我们不想替换它,所以

<a>
    <a></a>
    <b></b>
</a>
<a>
    <c></c>
    <a></a>
</a>

变成

<a>
    <a></a>
    <b></b>
    <c></c>
    <a></a>
</a>

另外,重复的根元素不能保证总是&lt;a&gt;;它可以有任何名称。

到目前为止,我一直在尝试想出某种优雅的正则表达式来完成这项任务,例如/&lt;((.|\n|\r)*?)&gt;(.|\n|\r)*&lt;\/\1&gt;/,但这样做的问题是内部 XML 上的贪婪匹配匹配太多,并且非内部 XML 上的贪婪匹配太少了。

我希望我不必求助于创建堆栈来计算打开和关闭标签,以确定我何时回到文档的根目录。我正在寻找一种简单而优雅的方法来解决这个问题。

如果其中一个处理这种情况,开源、第三方库可能是可接受的解决方案,但我宁愿避免使用它们。

有人有什么想法吗?

【问题讨论】:

    标签: c# xml regex


    【解决方案1】:

    实际上将 XML 读取为 XML 可能会更好...您应该能够创建将 ConformanceLevel 设置为 Fragment 的阅读器,并将所有片段作为普通 XML 读取。而不是使用普通的 XML 处理来选择/复制 Xml 节点。

    【讨论】:

    • 啊!这个答案揭示了我对在 .NET 中处理 XML 的无知。我不知道有一种方法可以自动解析不符合标准的 XML。谢谢!
    【解决方案2】:

    有人有一个很好的答案,他们刚刚删除了。获取根节点的名称,然后删除所有这些节点。应该很容易得到第一个节点的名称,不管它是什么。

    这将使文档基本上保持您想要的样子,然后只需将整个内容包装在其中一个节点中即可。完成。

    【讨论】:

      猜你喜欢
      • 2020-12-11
      • 1970-01-01
      • 2011-10-02
      • 2012-11-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多