Explicación de la comparación de estructuras XML - Devart blog

Este artículo describe los beneficios de la comparación estructural de archivos XML y sus limitaciones. Esta nueva característica de Code Compare 3.0 es una extensión de Structural Code Comparison para XML. En esta publicación, presentamos ejemplos que demuestran cuándo una función es útil y cuándo no.

A la mañana siguiente del lanzamiento de Code Compare 3.0, recibimos comentarios de nuestro usuario. Probó la nueva función y se sintió avergonzado por su rendimiento.

Esto es lo que escribió:

Descargué Code Compare, hizo una comparación estructural de archivos XML, pero no pareció funcionar. Dos archivos XML, Archivo 1 y Archivo 2, que eran básicamente iguales pero (a) no tenían líneas nuevas y (b) cambiaron el orden de los atributos, ninguno de los cuales cambió la semántica del archivo, así que esperaba que se compararan lo mismo. (Excepto por cualquier diferencia real).

Respondimos a este usuario por correo electrónico. Sin embargo, decidimos que sería inapropiado aclarar cómo funciona la nueva función en nuestro blog para evitar expectativas poco razonables.

Nosotros lo consideraremos:

  • 3 ejemplos donde la comparación XML estructural es útil.
  • 2 escenarios de comparación de archivos donde esta función es inútil e incluso confusa.
Índice

    Ventajas de la comparación XML estructural

    De acuerdo con la comparación habitual de texto, los archivos se consideran como secuencias comunes de caracteres en las que el programa intenta encontrar diferencias. La lógica de estas diferencias prácticamente no se tiene en cuenta.

    El algoritmo de comparación de código estructural (y XML en particular) es diferente. La diferencia es que los archivos se dividen primero en elementos estructurales (métodos o nodos), que luego se comparan como pequeñas secuencias de texto.

    Los ejemplos a continuación demuestran cómo puede beneficiarse al habilitar el modo de comparación estructural.

    Ejemplo 1: comparación de proyectos de MsBuild

    Figura 1 muestra un ejemplo de comparación de dos archivos XML pequeños. Sin embargo diferenciascomo se vio son significativos. Al menos lo parecen a primera vista.

    Figura 1: dos versiones del proyecto MS Build: se excluye la comparación estructural.

    Figura 1: dos versiones del proyecto MS Build: la comparación de estructuras está deshabilitada.

    Ahora activaremos el modo de comparación de código estructural y veremos el resultado. Para ello, abra Comparación menú y seleccione Comparación de código estructural. Figura 2 muestra los mismos archivos. Si los miramos de cerca, lo veremos. la verdadera diferencia es solo una: Se ha cambiado la versión del producto. Además, uno de los desarrolladores acaba de cambiar las propiedades.

    Figura 2: Dos versiones del proyecto MS Build - Comparación estructural incluida.

    Figura 2: Dos versiones del proyecto MS Build - Comparación estructural incluida.

    Ejemplo 2 - Comparación de archivos de proyecto de C#

    El segundo ejemplo de uso es el análisis del archivo .csproj modificado.
    El archivo contiene 3 tipos de cambios:

    • cambie la ruta al archivo;
    • cambiar el orden de los archivos del proyecto;
    • añadiendo archivos.

    figura 3 muestra el resultado de una comparación con una comparación estructural deshabilitada. Como puedes ver todos los cambios fueron mezclados lo que dificulta el análisis.

    Figura 3: Dos versiones del archivo de proyecto de C#: la comparación estructural está deshabilitada

    Figura 3: dos versiones del archivo de proyecto de C#: la comparación estructural está deshabilitada.

    Después de habilitar la comparación estructural (Figura 4) está claro qué archivos se han agregado. Esto no era tan obvio en el caso anterior.

    Figura 4: Dos versiones del archivo de proyecto C# - Comparación estructural incluida

    Figura 4: Dos versiones del archivo de proyecto de C# - Comparación estructural incluida.

    Ejemplo 3: comparación de archivos .xaml

    El ejemplo más reciente del uso de la comparación estructural para XML se muestra en base a una comparación de archivos .xaml. Como suele ser el caso cuando se configura la visualización de controles en una aplicación WPF, estos las propiedades a menudo se suman.

    Nuevamente, podemos cambiar los valores de los atributos, agregarlos, eliminarlos y ordenarlos. Figura 5 ilustra un ejemplo de tales cambios.

    Figura 5: Dos versiones del archivo .xaml - Comparación estructural deshabilitada

    Figura 5: dos versiones del archivo .xaml: la comparación estructural está deshabilitada.

    Así es como se ven estos cambios si incluye una comparación estructural (Figura 6).

    Figura 6: Dos versiones del archivo .xaml - Comparación estructural incluida

    Figura 6: dos versiones del archivo .xaml: comparación estructural incluida.

    Restricciones de la comparación XML estructural

    Ahora consideremos las limitaciones de la nueva característica. Inicialmente, al implementar esta función, elegimos entre la complejidad de la implementación y la utilidad. Como resultado, preferimos la introducción de una función que sería útil, aunque no siempre, que congelar una nueva versión para crear una funcionalidad universal.

    El archivo XML no está formateado.

    Code Compare conserva el formato original de los archivos XML. Tú decides si es bueno o malo. La diferencia en espacios y saltos de línea se puede aclarar con Ignora el espacio y Ignorar saltos de línea opciones de comparación.

    No se reconocen los atributos de elementos XML escritos en una sola línea

    En el ejemplo anterior de comparación de archivos .xaml, los atributos del elemento XML se colocaron en líneas separadas. Esto nos dio la oportunidad de comparar cada atributo individualmente.

    Si los atributos se colocaran en una sola línea, se compararían como simples secuencias de caracteres.

    No se tiene en cuenta la semántica de los archivos XML comparados.

    El algoritmo de comparación intenta correlacionar los elementos XML en función de los atributos coincidentes y los elementos secundarios. Pero todos los atributos tienen el mismo significado durante la comparación. Esto no siempre es cierto en un área en particular. Uno de los atributos puede ser más importante que los otros.

    Por ejemplo, en el archivo MS Build, para identificar el archivo ( Compilar elemento) solo un atributo es importante Incluir. Code Compare, sin embargo, tendrá en cuenta otros atributos (por ejemplo, Condición) junto a Incluir. Por lo tanto, los cambios significativos en el texto XML pueden provocar una falla en la lógica de comparación si la Comparación de código muestra más cambios de los que realmente hay.

    En tales casos, recomendamos deshabilitar el modo de comparación de código estructural y comparar archivos en modo normal.

    Siéntase libre de comentar esta publicación y compartir su opinión.

    Artículos de interés

    Subir