2012-06-20 62 views
-1

我试图用C#.NET 4.0中的重复根元素以编程方式清理无效的XML。我想要做的是所有的内部元素合并到一个根元素,并删除重复的根源,使用重复的根元素解析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匹配匹配太少。

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

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

有没有人有任何想法?

回答

5

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

+0

啊!这个答案揭示了我在.NET中处理XML时的无知。我不知道有一种方法可以自动分析不符合规范的XML。谢谢! –

0

有人有一个很好的答案,他们刚刚删除。获取根节点的名称,并删除所有这些节点。不管它是什么,应该很容易获得第一个节点的名称。

这将使文档基本上保持您想要的状态,然后将所有内容都包装在其中一个节点中。完成。