比较XmlDocument是否相等(内容明智)

Bla*_*man 14 c# xml xmldocument equality

如果我想比较XMlDocument的内容,它是这样的吗?

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

if(doc1 == doc2)
{

}
Run Code Online (Sandbox Code Playgroud)

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

Max*_*oro 34

在XLinq API上尝试DeepEquals方法.

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

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

} 
Run Code Online (Sandbox Code Playgroud)

另请参见LINQ to XML Trees的等式语义


LBu*_*kin 11

不.XmlDocument不会覆盖Equals()方法的行为,所以它实际上只是执行引用相等 - 这将在您的示例中失败,除非文档实际上是相同的对象实例.

如果要比较文档的内容(属性,元素,通信,PI等),您必须自己实现该逻辑. 请注意:这不是微不足道的.

根据您的具体情况,您可以从文档中删除所有非必要的空格(这本身可能很棘手),并比较生成的xml文本.这并不完美 - 它对于语义相同的文档而言是失败的,但在命名空间的使用和声明方式,或者某些值是否被转义,元素的顺序等方面都有所不同.正如我之前所说,XML比较并非无足轻重.

您还需要明确定义两个XML文档"相同"的含义.元素或属性排序是否重要?案例(在文本节点中)是否重要?你应该忽略多余的CDATA部分吗?处理指令是否重要?完全限定和部分限定的命名空间怎么样?

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

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

编辑: 如果您使用的是.NET 3.5 SP1,请查看@Max Toro的答案,因为显然XLinq中有一个可能有用的选项.很高兴知道它存在.


Wer*_*ght 9

一种简单的方法可以比较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);
Run Code Online (Sandbox Code Playgroud)