Quiero determinar si dos nodos secundarios diferentes dentro de un documento XML son iguales o no. Dos nodos deben considerarse iguales si tienen el mismo conjunto de atributos y notas del niño y todas las notas del niño son iguales también (es decir, el subárbol completo debe ser igual).Algoritmo eficiente para comparar nodos XML
El documento de entrada puede ser muy grande (hasta 60 MB, más de 100000 nodos para comparar) y el rendimiento es un problema.
¿Cuál sería una forma eficiente de verificar la igualdad de dos nodos?
Ejemplo:
<w:p>
<w:pPr>
<w:spacing w:after="120"/>
</w:pPr>
<w:r>
<w:t>Hello</w:t>
</w:r>
</w:p>
<w:p>
<w:pPr>
<w:spacing w:after="240"/>
</w:pPr>
<w:r>
<w:t>World</w:t>
</w:r>
</w:p>
Este fragmento de XML describe los párrafos en un documento OpenXML. El algoritmo se usaría para determinar si un documento contiene un párrafo (nodo w: p) con las mismas propiedades (nodo w: pPr) que otro párrafo anterior en el documento.
Una idea que tengo sería almacenar el XML externo de los nodos en un conjunto hash (normalmente tendría que obtener una representación de cadena canónica donde los atributos y notas secundarias se ordenan siempre de la misma manera, pero puedo esperar mis nodos ya están en tal forma).
Otra idea sería crear un objeto XmlNode para cada nodo y escribir un comparador que compare todos los atributos y los nodos secundarios.
Mi entorno es C# (.Net 2.0); cualquier comentario y más ideas son bienvenidas. ¿Tal vez alguien ya tiene una buena solución?
EDITAR: XmlDiff API de Microsoft realmente puede hacer eso, pero me preguntaba si habría un enfoque más ligero. XmlDiff parece producir siempre un diffgram y siempre producir primero una representación canónica de nodo, ambas cosas que no necesito.
EDIT2: Finalmente implementé mi propio XmlNodeEqualityComparer basado en la sugerencia realizada aquí. ¡¡¡¡Muchas gracias!!!!
Gracias, divo
Publicaciones relacionadas: http://stackoverflow.com/questions/167946/how-would-you-compare-two-xml-documents y http://stackoverflow.com/questions/275831/best-way-to- compare-2-xml-documents-in-net-closed –
Hola, gracias por tu comentario. XmlDiff parece bastante bueno, pero parece bastante pesado para mi problema específico. No es necesario que encuentre ninguna información sobre las diferencias, basta con una prueba simple igual o no y no es necesario crear una representación canónica que XmlDiff siempre hace. –