2010-05-27 49 views
12

如果我想比较一个XMlDocument的内容,是不是像这样?比较XmlDocument是否相等(内容明智)

XmlDocument doc1 = GetDoc1(); 
XmlDocument doc2 = GetDoc2(); 

if(doc1 == doc2) 
{ 

} 

我不检查它们是否都是相同的对象引用,但是如果xml的CONTENTS是相同的。

回答

10

号的XmlDocument不会覆盖Equals()方法所以,它实际上只是执行基准平等的行为 - 这会在你的榜样失败,除非该文件实际上是同一个对象实例。

如果您想比较文档的内容(属性,元素,评论,PI等),您必须自己实现该逻辑。被警告:这不是微不足道的。

根据您的具体情况,您可能能够从文档中删除所有非本质的空白(本身可能会非常棘手),并且它们会比较生成的xml文本。这并不完美 - 文档在语义上是相同的,但在命名空间的使用和声明方式,某些值是否被转义,元素顺序等方面存在差异。正如我之前所说的,XML比较不是微不足道的。

您还需要明确定义两个XML文档“相同”的含义。元素或属性排序是否重要?大小写(文本节点中)是否重要?你应该忽略多余的CDATA部分?处理指令是否计数?完全合格与部分合格的命名空间有什么区别?

在任何通用目的实现中,您可能希望将这两个文档转换为一些规范形式(无论是XML还是其他表示形式),然后比较规范化内容。

已存在执行XML差异化的工具,例如Microsoft XML Diff/Patch,您可以利用该工具来识别两个文档之间的差异。据我所知,该工具不是以源代码的形式发布的......所以要在嵌入式应用程序中使用它,您需要编写该过程的脚本(如果您打算使用它,则应首先验证许可条款是否允许其使用和再分发)。

编辑:退房@Max Toro's answer如果你使用.NET 3.5 SP1,因为显然有在XLINQ一个选项,可能会有所帮助。很高兴知道它存在。

0

LBushkin是对的,这不是微不足道的。由于XML是字符串数据,因此您可以在技术上对内容执行散列并对其进行比较,但这会受到诸如空白之类的内容的影响。

您可以在两个文档之间执行结构化差异(也称为'XML diffgram')并比较结果。例如,这就是.NET数据集如何跟踪更改。

除此之外,您必须遍历DOM并将元素,属性和值相互比较。如果涉及到一个模式,那么你还必须考虑职位等。

31

尝试XLinq API上的DeepEquals方法。

XDocument doc1 = GetDoc1(); 
XDocument doc2 = GetDoc2(); 

if(XNode.DeepEquals(doc1, doc2)) 
{ 

} 

参见Equality Semantics of LINQ to XML Trees

+0

不知道,谢谢。 – 2010-05-27 20:00:29

+0

非常好。我不知道这存在。它看起来像处理了我描述的许多案例。 – LBushkin 2010-05-27 20:03:25

+0

不错 - 这意味着我不需要导入第三方库来为我做这个! – 2014-05-23 22:16:18

8

一个简单的方法可能是比较OuterXml

var a = new XmlDocument(); 
var b = new XmlDocument(); 

a.LoadXml("<root foo='bar' />"); 
b.LoadXml("<root foo='bar'/>"); 

Debug.Assert(a.OuterXml == b.OuterXml);