2010-05-27 38 views

Respuesta

10

Nº XmlDocument no anula el comportamiento del método Equals() así, de hecho, es simplemente la realización de la igualdad de referencia - que fracasan en su ejemplo, a menos que los documentos son en realidad la misma instancia de objeto.

Si quiere comparar los contenidos (atributos, elementos, comentarios, IP, etc.) de un documento, tendrá que implementar esa lógica usted mismo.Tenga cuidado: no es trivial.

Dependiendo de su situación exacta, es posible que pueda eliminar todos los espacios en blanco no esenciales del documento (que a su vez pueden ser complicados) y comparar el texto xml resultante. Esto no es perfecto: falla para documentos que son semánticamente idénticos, pero difieren en cosas como cómo se usan y declaran los espacios de nombres, o si se escapan ciertos valores o no, el orden de los elementos, etc. Como dije antes, la comparación XML no es trivial.

También debe definir claramente qué significa que dos documentos XML sean "idénticos". ¿Importa el orden de elemento o atributo? ¿Importa el caso (en los nodos de texto)? ¿Deberías ignorar las secciones superfluas de CDATA? ¿Las instrucciones de procesamiento cuentan? ¿Qué pasa con los espacios de nombres totalmente calificados vs. parcialmente calificados?

En cualquier implementación de propósito general, es probable que desee transformar ambos documentos en alguna forma canónica (ya sea XML u otra representación) y luego comparar el contenido canonicalizado.

Ya existen herramientas que realizan la diferenciación XML, como Microsoft XML Diff/Patch,. Puede aprovechar eso para identificar diferencias entre dos documentos. Por lo que sé, esa herramienta no se distribuye en forma de fuente ... así que para usarla en una aplicación incrustada, necesitarás hacer un script del proceso (si planeas usarla, primero debes verificar que los términos de la licencia permitan su uso y redistribución))

EDIT:Salida @Max Toro's answer si está utilizando .NET 3.5 SP1, ya que aparentemente hay una opción en XLinq que puede ser útil. Es bueno saber que existe.

0

LBushkin tiene razón, esto no es trivial. Dado que XML es un dato de cadena, técnicamente podría realizar un hash de los contenidos y compararlos, pero eso se verá afectado por cosas como el espacio en blanco.

Puede realizar un diff estructurado (también llamado 'XML diffgram') entre los dos documentos y comparar los resultados. Así es como los conjuntos de datos .NET hacen un seguimiento de los cambios, por ejemplo.

Aparte de eso, debe iterar a través del DOM y comparar elementos, atributos y valores entre sí. Si hay un esquema involucrado, entonces también debería tener en cuenta las posiciones y demás.

31

Pruebe el método DeepEquals en la API XLinq.

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

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

} 

Véase también Equality Semantics of LINQ to XML Trees

+0

No lo sé, gracias. –

+0

Muy agradable. No sabía que esto existía. Parece que maneja muchos de los casos que describo. – LBushkin

+0

Bueno, esto significa que no necesité importar una biblioteca de terceros para hacer esto por mí. –

8

Una forma sencilla podría ser comparar 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); 
Cuestiones relacionadas