-1

我正在尝试以编程方式清除 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>

此外,不保证重复的根元素始终为<a>; 它可以有任何名称。

到目前为止,我一直在尝试考虑某种优雅的正则表达式来完成此任务,例如/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/,但这样做的问题是内部 XML 上的贪婪匹配匹配太多,而内部 XML 上的非贪婪匹配匹配太少。

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

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

有没有人有任何想法?

4

2 回答 2

5

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

于 2012-06-20T23:07:32.553 回答
0

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

这将使文档基本上按照您想要的方式保留,然后将整个内容重新包装在其中一个节点中。完毕。

于 2012-06-20T22:56:11.570 回答