Una tarde perdí un archivo de configuración que "cambiado" entre dos implementaciones. La diferencia en mi terminal era una pared roja, cientos de líneas, y pasé una hora buscando el cambio real antes de darme cuenta de que la canalización de implementación había reformateado el archivo: lo había vuelto a sangrar, había reordenado algunos atributos, había vuelto a envolver algunas líneas largas. Ningún byte que le importaría a un analizador había cambiado realmente, excepto un único valor enterrado en el ruido. Una diferencia basada en líneas no pudo decirme eso, porque una diferencia basada en líneas no entiende XML. Esta guía trata sobre comparar XML de la manera que merece ser comparado, utilizando el Comprobador de diferencias XML en Toolz.dev, y por qué una comparación estructural encuentra el único cambio que importa en lugar de ahogarlo en el formato.
TL;Dr: Una diferencia XML compara dos documentos como árboles de nodos, no como líneas de texto, por lo que volver a sangrar, reordenar atributos o volver a envolver líneas no se registra como un cambio. Informa qué elementos, atributos y valores de texto se agregaron, eliminaron o cambiaron, cada uno fijado en una ruta de nodo. El Comprobador de diferencias XML hace esto completamente en su navegador, sin cargar nada.
¿qué es un verificador de diferencias XML?
Un verificador de diferencias XML compara dos documentos XML e informa lo que cambió como un conjunto de diferencias estructurales: qué elementos aparecieron o desaparecieron, qué atributos cambiaron de valor y dónde difiere el contenido del texto. En lugar de comparar los archivos línea por línea, analiza ambos en árboles de nodos y los compara como datos. Pegas el original a la izquierda, la nueva versión a la derecha y obtienes una lista de diferencias, cada una etiquetada con la ruta exacta en el árbol donde sucedió.
El objetivo de una comparación estructural es que XML tiene el mismo significado en muchos diseños de bytes diferentes. El Especificación XML W3C es explícito que algunos detalles de la superficie no afectan el documento analizado: el orden de los atributos de un elemento no es significativo y los espacios en blanco entre elementos generalmente solo tienen formato. Dos archivos pueden ser estructuralmente idénticos y diferir en sangría, orden de atributos, finales de línea o si un elemento vacío está escrito como <tag></tag> investigaciones operacionales <tag/>. Una diferencia de texto sin formato marca todo eso; una diferencia estructural lo ignora y muestra sólo lo que un analizador realmente leería de manera diferente.
En Toolz.dev el flujo de trabajo es corto. Pegue ambos documentos, elija si desea ignorar espacios en blanco, atributos o casos y presione Comparar. La herramienta analiza ambos árboles y enumera todas las diferencias por ruta, agrupadas en agregadas, eliminadas y modificadas, con los valores antiguos y nuevos uno al lado del otro.
¿en qué se diferencia una diferencia XML de una diferencia de texto?
Una diferencia de texto, del tipo integrado en Git y en la mayoría de los editores, compara archivos como secuencias de líneas y encuentra el conjunto más corto de inserciones y eliminaciones que convierte a uno en otro. Eso es exactamente lo correcto para el código fuente, donde las líneas son unidades significativas. Es el modelo equivocado para XML, donde el significado vive en el árbol y las saltos de línea son decoración.
Los modos de falla son predecibles. Vuelva a sangrar el documento y un texto marca casi cada línea cambiada. Reordene dos atributos en un elemento y señaliza esa línea aunque el elemento sea idéntico a un analizador. Agregue un solo hijo cerca de la parte superior y cada línea debajo se desplaza, por lo que la diferencia muestra una cascada de movimientos que en realidad no cambian. Terminas escaneando cientos de líneas marcadas para encontrar la que importa, que es la tarde que describí anteriormente.
Una diferencia estructural evita todo eso analizando primero. Construye un árbol a partir de cada documento y luego recorre los dos árboles comparando nodos. Las diferencias de formato simplemente no existen a nivel de árbol, por lo que no pueden aparecer en la salida. Lo que queda es el conjunto de cambios que alterarían el comportamiento del software que consume XML, que es casi siempre el conjunto que realmente le importa. Si sus datos son JSON en lugar de XML, se aplica el mismo principio y el Diferencia de JSON la herramienta hace allí la comparación estructural equivalente.
¿Cómo decide qué cambió?
La comparación se realiza en tres capas en cada elemento y separarlos es lo que hace que la salida sea legible.
Los atributos se comparan por nombre, independientemente del orden en que aparecen en la etiqueta, porque el orden de los atributos no es significativo en XML. Para cada elemento, la herramienta verifica qué atributos existen en ambos lados e informa que un atributo cambió cuando su valor difiere, se agregó cuando aparece solo a la derecha o se eliminó cuando aparece solo a la izquierda. Reordenando <a x="1" y="2"/> para <a y="2" x="1"/> no produce ninguna diferencia.
El contenido del texto se compara con el texto directo de cada elemento. Con el manejo de espacios en blanco activado, las ejecuciones de espacios y nuevas líneas se colapsan y los espacios en blanco iniciales y finales se recortan, por lo que una impresión bonita del documento no crea cambios de texto fantasma. Sólo se informa un cambio genuino en las palabras entre las etiquetas.
Los elementos secundarios son la parte interesante. Los elementos que comparten el nombre de una etiqueta se emparejan por su orden de aparición: el primero <item> a la izquierda se compara con el primero <item> a la derecha, del segundo al segundo, y así sucesivamente. Cuando un lado tiene más ocurrencias que el otro, los extras se informan como agregados o eliminados en lugar de forzar una desalineación. Esta regla de orden es lo que evita que un pequeño cambio en un elemento repetido caiga en cascada en una diferencia de cada hermano.
Así es como se comparan los dos modelos de comparación:
| Aspecto | Diferencia de texto | Diferencia XML (estructural) |
|---|---|---|
| Unidad comparada | Líneas de texto | Nodos en un árbol |
| Redención | Se muestra como cambios | Ignorado |
| Reordenar atributos | Se muestra como un cambio | Ignorado |
| Los informes cambian de ubicación | Número de línea | Ruta del nodo, por ejemplo, /catalog/book[2]/@id |
| Distingue elemento versus atributo versus texto | prohibido | sí |
| mejor para | Código fuente, prosa | Configuración XML, cargas útiles API, SVG, mapas de sitio |
Un ejemplo concreto deja claras las capas. Tome un pequeño catálogo de libros donde, entre dos versiones, un libro y el atributo de categoría #39 cambia de ficción a misterio, ese mismo libro y el #39; el texto de precio cambia de 12,99 a 14,99, y el segundo libro obtiene un nuevo elemento isbn. Una diferencia de línea marcaría los tres más cualquier reindentación a su alrededor, mezclada. La diferencia estructural informa exactamente tres diferencias: un atributo modificado en la ruta de la categoría, un nodo de texto modificado en la ruta del precio y un elemento agregado en la ruta isbn. Cada uno está etiquetado con su tipo, por lo que se puede decir de un vistazo que dos fueron ediciones de datos existentes y una fue una adición genuina. Esa separación es la diferencia entre leer un informe y decodificarlo.
La herramienta también agrupa los resultados en pestañas agregadas, eliminadas y modificadas con un recuento continuo, para que pueda responder primero preguntas aproximadas, como " ¿Se eliminó algo, "? antes de profundizar en los detalles. En un documento grande, este pedido es importante: las eliminaciones suelen ser el cambio más peligroso, porque un elemento eliminado puede eliminar silenciosamente un campo requerido y poder aislarlos sin pasar por ediciones no relacionadas es un ahorro de tiempo real.
¿Qué significa la ruta del nodo en una diferencia?
Cada diferencia está etiquetada con una ruta que le indica exactamente en qué parte del árbol se encuentra, para que pueda saltar a ella en lugar de escanear el archivo. La ruta se construye a partir de nombres de elementos, unidos por barras diagonales desde la raíz hacia abajo. Cuando un elemento tiene hermanos del mismo nombre, un índice único entre paréntesis elimina la ambigüedad de cuál /catalog/book[2] es el segundo libro. Un atributo está escrito con un @ prefijo, como en /catalog/book[1]/@category, y un cambio de texto está marcado con text(), como en /catalog/book[2]/price/text().
Esta notación está deliberadamente cerca de XPath, el lenguaje W3C para direccionar nodos en un documento XML, por lo que si ya lee XPath, las rutas le resultarán familiares y, a menudo, puede pegar una expresión similar en sus propias herramientas para seleccionar el mismo nodo. Incluso sin conocer XPath, las rutas se leen de forma natural: los nombres bajan por el árbol, los corchetes eligen un hermano @ es un atributo, y text() es el contenido.
Debido a que la ruta también nombra el tipo de cambio, el informe responde tres preguntas a la vez: qué cambió, dónde vive y si fue un elemento, un atributo o un texto. Esto suele ser suficiente para abrir el archivo correcto y arreglar la línea correcta sin más búsqueda.
¿Cuándo usaría esto realmente?
La deriva de configuración es el caso que más golpeo. Cuando un servicio se comporta de manera diferente entre dos entornos y el único sospechoso es una configuración XML, comparar los dos archivos estructuralmente le indica en segundos si un valor realmente cambió o si alguien simplemente reformateó el archivo. Lo mismo se aplica a la creación e implementación de canalizaciones que reescriben XML, donde es necesario confirmar que una transformación cambió solo lo que se suponía que debía hacer.
El trabajo de API e integración es el siguiente. Las respuestas SOAP, los feeds RSS y Atom y las API REST más antiguas todavía hablan XML, y cuando una carga útil deja de analizar correctamente, una diferencia estructural frente a una muestra conocida señala rápidamente el elemento infractor. SVG también es XML, por lo que comparar dos íconos exportados muestra exactamente qué ruta o atributo alteró un editor. Mapas de sitio, archivos de diseño de Android, POM de Maven y .docx todos los componentes internos son XML bajo el capó y todos se benefician del mismo tratamiento. Construyo a lo largo de la pila y XML aparece en más rincones de los que la gente espera, razón por la cual esto vive al lado Formateador XML y XML a JSON en mis marcadores. Esbocé cómo encajan estos en un kit más amplio del Guía JSON a XML.
También hay un ángulo de revisión de código. Cuando una solicitud de extracción toca un dispositivo XML o un archivo generado, la diferencia sin procesar en la interfaz de usuario de revisión a menudo es ilegible porque un formateador reescribió todo. Ejecutar el antes y el después a través de una comparación estructural, luego pegar el breve informe en la revisión, le dice a su revisor lo que realmente cambió de un vistazo en lugar de pedirle que confíe en una pared de rojo. El informe de texto copiable de tool' existe exactamente para eso: un resumen compacto de cada nodo agregado, eliminado y modificado con sus valores de antes y después, listo para colocar en un ticket, un mensaje de confirmación o un hilo de chat.
Las herramientas de comparación vecinas cubren los casos que XML diff no cubre. Cuando sus datos son tabulares, el Diferencia CSV compara filas y celdas, y para dos listas simples Comparación de listas la herramienta establece diferencias. Comparten la misma filosofía: primero analizan los datos en su forma natural y luego los comparan, de modo que la diferencia refleja el significado más que el diseño.
¿Cuáles son los límites y mi XML es privado?
La herramienta compara la estructura, lo que significa que deliberadamente no informa los tipos de diferencias que la estructura no captura. Reordenar dos atributos, cambiar sangría o intercambiar sintaxis de cierre automático se tratan como si no hubiera cambios, por diseño. Si su caso de uso realmente necesita una comparación exacta de bytes, una diferencia de texto es la herramienta correcta y no lo es. La diferencia estructural también empareja elementos repetidos por posición, por lo que si los mismos registros se mezclan en un orden diferente, la herramienta considera que los movidos se han cambiado en lugar de reubicados; ordenar ambos documentos primero por una clave estable, cuando tiene sentido, da el resultado más limpio.
Se informa XML con formato incorrecto en lugar de adivinarlo. Si un documento tiene una etiqueta no coincidente o no cerrada, o más de un elemento raíz, la herramienta nombra el problema y le indica de qué lado proviene, para que nunca obtenga una diferencia engañosa por una entrada rota. Maneja las construcciones comunes del mundo real que debe tener un analizador: atributos en comillas simples o dobles, etiquetas de cierre automático, secciones CDATA, comentarios, instrucciones de procesamiento y referencias de entidades estándar como < y &.
En materia de privacidad, todo se ejecuta en su navegador. Ambos documentos se analizan y comparan localmente y no se carga, registra ni almacena nada. Esa es la propiedad que hace que sea seguro diferenciar una configuración de producción, una carga útil API interna o un archivo específico del cliente, ninguno de los cuales pertenece a un servidor extraño 's. El Privacidad de datos en herramientas en línea guide explica cómo verificar que una herramienta sea genuinamente del lado del cliente, lo cual vale la pena hacer antes de pegar cualquier elemento confidencial en cualquier herramienta web.
Preguntas frecuentes
¿cómo comparo dos archivos XML?
Pegue el XML original en el primer campo y el XML modificado en el segundo, luego presione Comparar. La herramienta analiza ambos en árboles de nodos y enumera cada elemento, atributo y valor de texto agregado, eliminado y modificado, cada uno fijado a su ruta de nodo. No se carga nada.
¿en qué se diferencia una diferencia XML de una diferencia de texto sin formato?
Una diferencia de texto compara archivos línea por línea, por lo que volver a sangrar, reordenar atributos o volver a envolver líneas hace que casi todo parezca cambiado. Una diferencia XML analiza ambos documentos primero en árboles y los compara estructuralmente, por lo que solo informa diferencias que cambiarían la forma en que un analizador lee el documento.
¿reordenar atributos cuenta como un cambio?
No. Los atributos se comparan por nombre independientemente del orden en que aparecen en la etiqueta, porque el orden de los atributos no es significativo en XML. Sólo se informa un valor modificado, un atributo agregado o un atributo eliminado.
¿Cómo coinciden los elementos repetidos entre los dos documentos?
Los elementos secundarios que comparten el nombre de una etiqueta se emparejan por su orden de aparición, por lo que el primer elemento se compara con el primer elemento, el segundo con el segundo, y así sucesivamente. Si un documento tiene más apariciones que el otro, los extras se informan como agregados o eliminados.
¿Qué significa la ruta del nodo en cada diferencia?
La ruta muestra en qué parte del árbol el cambio es, usando nombres de elementos, un índice único entre paréntesis cuando hay hermanos del mismo nombre, @nombre para un atributo y texto () para contenido de texto. Por ejemplo, /catalog/book[2]/@id apunta al atributo id del segundo libro.
¿los espacios en blanco o el formato afectan la comparación?
De forma predeterminada, el texto solo de espacios en blanco se ignora y las ejecuciones de espacios en blanco dentro del texto se colapsan, por lo que reformatear el documento no crea diferencias falsas. Puede confiar en la comparación estructural en lugar de hacer coincidir exactamente la sangría.
¿qué sucede si el XML tiene un formato incorrecto?
La herramienta informa un error claro al nombrar el problema, como una etiqueta que no coincide o no está cerrada, y le indica de qué documento proviene. No adivina una reparación, por lo que nunca obtiene una diferencia engañosa por una entrada rota.
¿Mis documentos XML se cargan en alguna parte?
No. Todo el análisis y la comparación se realizan como JavaScript en su navegador. No se transmite, registra ni almacena nada. Puede confirmar esto mirando la pestaña de red o desconectándose de Internet, la herramienta sigue funcionando sin conexión.
Compara tus propios documentos con los gratuitos Comprobador de diferencias XML. Informa diferencias estructurales por ruta de nodo, completamente en su navegador, sin nada cargado.



