我试图以编程方式在C#.NET 4.0中使用重复的根元素清理无效的XML.我想要做的是将所有内部元素合并到一个根元素中并删除重复根,以便这样做
<a>
<b></b>
</a>
<a>
<c></c>
</a>
Run Code Online (Sandbox Code Playgroud)
变
<a>
<b></b>
<c></c>
</a>
Run Code Online (Sandbox Code Playgroud)
但是,重复的根元素也可能出现在内部XML中.在这种情况下,我们不想替换它,所以
<a>
<a></a>
<b></b>
</a>
<a>
<c></c>
<a></a>
</a>
Run Code Online (Sandbox Code Playgroud)
变
<a>
<a></a>
<b></b>
<c></c>
<a></a>
</a>
Run Code Online (Sandbox Code Playgroud)
此外,不保证重复的根元素始终是<a>; 它可以有任何名字.
到目前为止,我一直在尝试考虑某种优雅的Regex来完成这项任务,例如/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/,但问题是内部XML上的贪婪匹配过多,内部XML上的非贪婪匹配比赛太少了.
我希望我不必使用创建堆栈来计算打开和关闭标签,以确定我何时回到文档的根目录.我正在寻找一种解决这个问题的简单而优雅的方法.
如果其中一个处理这种情况,开源的第三方库是可能可接受的解决方案,但我宁愿避免使用它们.
有没有人有任何想法?