【发布时间】: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>
另外,重复的根元素不能保证总是<a>;它可以有任何名称。
到目前为止,我一直在尝试想出某种优雅的正则表达式来完成这项任务,例如/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/,但这样做的问题是内部 XML 上的贪婪匹配匹配太多,并且非内部 XML 上的贪婪匹配太少了。
我希望我不必求助于创建堆栈来计算打开和关闭标签,以确定我何时回到文档的根目录。我正在寻找一种简单而优雅的方法来解决这个问题。
如果其中一个处理这种情况,开源、第三方库可能是可接受的解决方案,但我宁愿避免使用它们。
有人有什么想法吗?
【问题讨论】: