我正在尝试以编程方式清除 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 上的非贪婪匹配匹配太少。
我希望我不必求助于创建堆栈来计算打开和关闭标签,以确定我何时回到文档的根目录。我正在寻找一种简单而优雅的方法来解决这个问题。
如果其中一个处理这种情况,开源第三方库可能是可接受的解决方案,但我宁愿避免使用它们。
有没有人有任何想法?