Cuando tengo dos objetos XML, ¿cómo puedo compararlos para la igualdad exacta (todos los mismos nodos y atributos y valores) usando XPath?Uso de XPath para comparar dos objetos XML para igualdad exacta
Respuesta
En XPath 2.0, utilice la función estándar deep-equal().
Xpath 1.0 no tiene esta función, por lo tanto, la comparación debe realizarse dentro del lenguaje que aloja XPath.
Puede utilizar esta solución en caso se debe utilizar XPath 1.0: Generate/get xpath from XML node java para obtener una colección de expresiones XPath para cada nodo de Document1
y otra colección de expresiones XPath para cada nodo de Document2
. Luego compare las dos colecciones: deben tener el mismo número de expresiones cada una y las expresiones deben ser equivalentes.
Alternativamente, puede generar simplemente verificar que las dos colecciones contienen el mismo número de expresiones y aplicar cada una de las expresiones de Document1
en Document2
.
XPath 2.0 tiene una función de igualdad profunda para eso: http://www.w3.org/TR/xpath-functions/#func-deep-equal. XPath 1.0 no tiene nada comparable, necesitaría rodar el suyo, en cualquier idioma de host con el que utilice XPath 1.0.
He usado una combinación de XSLT 1.0 y Bash para comparar nodos específicos entre sí en función de sus md5sums.
Usando test = "$ index = $ navigator", porque no pude copiar-basado en un nodo [$ navigator] directamente.
<xsl:stylesheet version="1.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:ns="http://www.example.org">
<xsl:output method="xml" omit-xml-declaration="yes"/>
<xsl:param name="navigator"/>
<xsl:param name="part"/>
<xsl:template match="/">
<xsl:for-each select="/ns:mappings/ns:mapping">
<xsl:variable name="index" select="position()" />
<xsl:if test="$index=$navigator">
<xsl:choose>
<xsl:when test="$part='source'">
<xsl:copy-of select="ns:source/ns:taxonpath"/>
</xsl:when>
<xsl:when test="$part='target'">
<xsl:copy-of select="ns:target/ns:taxonpath"/>
</xsl:when>
<xsl:when test="$part='mapping'">
<xsl:copy-of select="."/>
</xsl:when>
</xsl:choose>
</xsl:if>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
mappingcount=$(cat mapping.xml | grep "<mapping>" | wc -l)
counter=1
while [ $counter -lt $mappingcount ]; do
sourcehash=$(xsltproc --stringparam navigator $counter --stringparam part source compare.xslt mapping.xml | md5sum | cut -d " " -f1)
targethash=$(xsltproc --stringparam navigator $counter --stringparam part target compare.xslt mapping.xml | md5sum | cut -d " " -f1)
if [ "$sourcehash" == "$targethash" ]; then
xsltproc --stringparam navigator $counter --stringparam part mapping compare.xslt mapping.xml
fi
let counter=counter+1
done
Y una parte de la mapping.xml
<mappings xmlns="http://www.example.org">
<mapping>
<source>
<taxonpath>
<taxon>
<id>c001f86a-4f8f-4420-bd78-381c615ecedc</id>
<entry>Aardrijkskunde</entry>
</taxon>
<taxon>
<id>65c33fa0-420a-4399-a6f8-595294179df3</id>
<entry>Weer en klimaat</entry>
</taxon>
</taxonpath>
</source>
<relationship>ter info</relationship>
<target>
<taxonpath>
<taxon>
<id>c001f86a-4f8f-4420-bd78-381c615ecedc</id>
<entry>Aardrijkskunde</entry>
</taxon>
<taxon>
<id>65c33fa0-420a-4399-a6f8-595294179df3</id>
<entry>Systeem aarde</entry>
</taxon>
</taxonpath>
</target>
</mapping>
</mappings>
- 1. Smalltalk - Comparar dos cadenas para la igualdad
- 2. Método común para comparar dos objetos Java
- 3. ¿Se pueden comparar objetos por dirección para la igualdad?
- 4. Comparar dos objetos con un cheque para nulo
- 5. ¿Cómo comparar dos gráficos de objetos .NET para las diferencias?
- 6. ¿Es mejor usar XNodeEqualityComparer o XElement.DeepEquals para comparar objetos xml?
- 7. Probar objetos ActiveSupport :: TimeWithZone para igualdad
- 8. ¿Cuál es la forma más rápida de comparar dos matrices para la igualdad?
- 9. Realizar Assert.AreMatch() para comparar propiedades en dos objetos
- 10. Algoritmo eficiente para comparar nodos XML
- 11. ¿Cómo funciona Ruby's Array? comparar elementos para la igualdad?
- 12. Octave/MATLAB: ¿Cómo comparar las estructuras para la igualdad?
- 13. Usando XPath para analizar un documento XML
- 14. Comparación de dos matrices numpy para la igualdad, elemento-sabio
- 15. ¿Cómo uso jquery para comparar los dos selectores?
- 16. ¿La forma más compacta de comparar tres objetos para la igualdad usando Java?
- 17. XPath - Consulta de dos documentos XML
- 18. comparar la igualdad de char [] en C
- 19. Cómo comparar 2 objetos por la igualdad en Objective-C
- 20. comparar arrays para la igualdad, el orden de los elementos
- 21. ¿Manera fácil de comparar ArrayLists para la igualdad usando JUnit?
- 22. Igualdad entre dos enumerables
- 23. comparar dos lista <string> por la igualdad
- 24. ¿Qué tan caro es comparar dos conjuntos desordenados para la igualdad?
- 25. ¿Cómo comparar dos elementos del mismo tipo genérico sin restricciones para la igualdad?
- 26. ¿Es una buena idea comparar double.MaxValue para la igualdad?
- 27. Prueba de delegados para igualdad
- 28. Comparar dos objetos y encontrar las diferencias
- 29. ¿Existe un enfoque idiomático en C++ para comparar tipos polimórficos para la equivalencia de objetos?
- 30. Proceso para comparar dos conjuntos de datos