使用重复的根元素解析XML

时间:2012-06-20 22:48:16

标签: c# xml regex

我正在尝试以编程方式在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上的非贪婪匹配太少了。

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

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

有没有人有任何想法?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:0)

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

这将基本上保留文档的方式,然后将整个内容重新包装在其中一个节点中。完成。