我正在尝试以编程方式在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>
;它可以有任何名字。
到目前为止,我一直在尝试使用某种优雅的Regex来完成这项任务,例如/<((.|\n|\r)*?)>(.|\n|\r)*<\/\1>/
,但问题是内部XML上的贪婪匹配太多了,内部XML上的非贪婪匹配太少了。
我希望我不必使用创建堆栈来计算打开和关闭标签,以确定我何时回到文档的根目录。我正在寻找一种解决这个问题的简单而优雅的方法。
开源,第三方库是潜在可接受的解决方案,如果其中一个处理这种情况,但我宁愿避免它们。
有没有人有任何想法?
答案 0 :(得分:5)
将XML实际读取为XML可能更好......您应该能够创建将ConformanceLevel设置为Fragment的读取器,并将所有片段作为普通XML读取。而不是使用普通的XML处理来选择/复制Xml节点。
答案 1 :(得分:0)
他们刚刚删除了一个很好的答案。获取根节点的名称,然后删除所有这些节点。无论它是什么,都应该很容易得到第一个节点的名称。
这将基本上保留文档的方式,然后将整个内容重新包装在其中一个节点中。完成。