如果我想比较一个XMlDocument的内容,它是这样吗?
XmlDocument doc1 = GetDoc1(); XmlDocument doc2 = GetDoc2(); if(doc1 == doc2) { }
我不检查它们是否是相同的对象引用,但是如果xml的CONTENTS是相同的.
解决方法
不,XmlDocument不会覆盖Equals()方法的行为,所以实际上只是执行引用的相等性,这在你的例子中将失败,除非文档实际上是同一个对象实例.
如果要比较文档的内容(属性,元素,更改,PI等),您将必须自己实现该逻辑.被警告:这不是微不足道的.
根据您的具体情况,您可能可以从文档中删除所有非必需的空白(这本身可能很棘手),并且它们会比较所生成的xml文本.这不是完美的 – 对于语义相同的文档而言,它失败,但在命名空间被使用和声明的方式上不同,或者某些值是否被转义,元素的顺序等等也是不同的.如前所述,XML比较并不是微不足道的.
您还需要清楚地定义两个XML文档的意思是“相同”.元素或属性顺序是否重要?情况(文本节点)是否重要?你应该忽略多余的CDATA部分吗?处理说明是否计数?完全合格或部分合格的命名空间怎么样?
在任何通用的实现中,你可能想要将这两个文档转换成一些规范的形式(无论是XML还是其他表示),然后比较规范化的内容.
已经存在执行XML差异功能的工具(如Microsoft XML Diff/Patch),您可以利用此功能来识别两个文档之间的差异.据我所知,该工具不以源代码形式发布…所以要在嵌入式应用程序中使用它,您需要脚本化该过程(如果您打算使用该过程,则应首先验证许可条款是否允许使用和重新分发).
编辑:如果您使用.NET 3.5 SP1,请查看@Max Toro’s answer,显然XLinq中有一个可能有帮助的选项.很高兴知道它存在.