J'ai perdu une après-midi une fois à cause d'un fichier de configuration que " ; changé" ; entre deux déploiements Le diff dans mon terminal était un mur de rouge, des centaines de lignes, et j'ai passé une heure à rechercher le vrai changement avant de réaliser que le pipeline de déploiement avait reformaté le fichier : réindenté, réorganisé quelques attributs, remballé quelques longues lignes Pas un octet dont un analyseur se soucierait n'avait réellement changé, sauf une seule valeur enfouie dans le bruit Une diff basée sur les lignes ne pouvait pas me dire que, parce qu'une diff basée sur les lignes ne comprend pas XML. Ce guide concerne la comparaison XML de la façon dont il mérite d'être comparé, en utilisant le Vérificateur de différence XML sur Toolz.dev, et pourquoi une comparaison structurelle trouve le seul changement qui compte au lieu de le noyer dans le formatage.
tl;dr : Une diff XML compare deux documents en tant qu'arborescences de nœuds, et non en tant que lignes de texte, donc réindenter, réordonnancer des attributs ou remballer des lignes ne s'enregistre pas en tant que changement Il rapporte quels éléments, attributs et valeurs de texte ont été ajoutés, supprimés ou modifiés, chacun épinglé sur un chemin de nœud Le Vérificateur de différence XML fait cela entièrement dans votre navigateur, sans rien téléchargé.
Qu'est-ce qu'un vérificateur de différences XML ?
Un vérificateur de différences XML compare deux documents XML et rapporte ce qui a changé comme un ensemble de différences structurelles : quels éléments sont apparus ou ont disparu, quels attributs ont changé de valeur et où le contenu du texte diffère Au lieu de comparer les fichiers ligne par ligne, il analyse les deux dans les arbres de nœuds et les compare en tant que données Vous collez l'original à gauche, la nouvelle version à droite, et récupérez une liste de différences, chacune étiquetée avec le chemin exact dans l'arbre où cela s'est produit.
Le point d'une comparaison structurelle est que XML porte la même signification sur de nombreuses dispositions d'octets différentes Le Spécification XML W3C est explicite que certains détails de surface n'affectent pas le document analysé : l'ordre des attributs sur un élément n'est pas significatif, et l'espace entre les éléments est généralement simplement formatage Deux fichiers peuvent être structurellement identiques tout en différant par l'indentation, l'ordre des attributs, les terminaisons de ligne, ou si un élément vide est écrit comme <tag></tag> ou <tag/>. Une différence en texte brut signale tout cela ; une différence structurelle l'ignore et montre uniquement ce qu'un analyseur lirait réellement différemment.
Sur Toolz.dev le workflow est court Coller les deux documents, choisir d'ignorer les espaces, les attributs ou la casse, et appuyer sur Comparer L'outil analyse les deux arbres et répertorie chaque différence par chemin, regroupés en ajoutés, supprimés et modifiés, avec les anciennes et les nouvelles valeurs côte à côte.
En quoi un XML diff est-il différent d'un texte diff ?
Une diff de texte, du genre de celle intégrée dans Git et la plupart des éditeurs, compare les fichiers comme des séquences de lignes et trouve l'ensemble le plus court d'insertions et de suppressions qui se transforment l'une en l'autre C'est exactement juste pour le code source, où les lignes sont des unités significatives C'est le mauvais modèle pour XML, où le sens vit dans l'arbre et les sauts de ligne sont la décoration.
Les modes de défaillance sont prévisibles Réindentez le document et une diff de texte marque presque chaque ligne modifiée Réorganisez deux attributs sur un élément et il signale cette ligne même si l'élément est identique à un analyseur Ajoutez un seul enfant près du haut et chaque ligne en dessous se décale, donc la diff montre une cascade de mouvements qui ne changent pas vraiment Vous finissez par scanner des centaines de lignes signalées pour trouver celle qui compte, qui est l'après-midi que j'ai décrit ci-dessus.
Une diff structurelle évite tout cela en analysant d'abord Il construit un arbre à partir de chaque document, puis parcourt les deux arbres ensemble en comparant les nœuds Les différences de formatage n'existent tout simplement pas au niveau de l'arbre, donc elles ne peuvent pas apparaître dans la sortie Il reste l'ensemble des changements qui modifieraient le comportement des logiciels consommant le XML, qui est presque toujours l'ensemble qui vous tient réellement à cœur Si vos données sont JSON plutôt que XML, le même principe s'applique et le Diff JSON tool y fait la comparaison structurelle équivalente.
Comment décide-t-elle de ce qui a changé ?
La comparaison se déroule en trois couches au niveau de chaque élément, et les séparer est ce qui rend la sortie lisible.
Les attributs sont comparés par nom, indépendamment de l'ordre dans lequel ils apparaissent dans la balise, car l'ordre des attributs n'est pas significatif en XML Pour chaque élément l'outil vérifie quels attributs existent des deux côtés, et signale un attribut tel que changé lorsque sa valeur diffère, ajouté lorsqu'il apparaît uniquement à droite, ou supprimé lorsqu'il apparaît uniquement à gauche Réordonnancement <a x="1" y="2"/> à <a y="2" x="1"/> ne produit aucune différence du tout.
Le contenu du texte est comparé comme le texte direct de chaque élément Avec la gestion des espaces allumés, les séries d'espaces et de nouvelles lignes sont effondrées et les espaces de début et de fin sont coupés, donc la jolie impression du document ne crée pas de changements de texte fantôme Seule une véritable modification des mots entre les balises est signalée.
Les éléments enfants sont la partie intéressante Les éléments qui partagent un nom de balise sont appariés par leur ordre d'apparition : le premier <item> a gauche est comparé au premier <item> à droite, du deuxième au deuxième, et ainsi de suite Lorsqu'un côté a plus d'occurrences que l'autre, les extras sont signalés comme ajoutés ou supprimés plutôt que de forcer un désalignement Cette règle d'ordre est ce qui empêche un petit changement dans un élément répété de cascader dans une diff de chaque frère ou sœur.
Voici comment les deux modèles de comparaison s'empilent :
| Aspect | Diff textuel | XML diff (structurel) |
|---|---|---|
| Unité comparée | Lignes de texte | Nœuds dans un arbre |
| Réindentation | Affiche en tant que changements | Ignoré |
| Réordre d'attributs | Spectacles comme un changement | Ignoré |
| Les rapports changent d'emplacement | Numéro de ligne | Chemin du nœud, par exemple /catalogue/livre[2]/@id |
| Distingue l'élément vs l'attribut vs le texte | non | oui |
| le mieux pour | Code source, prose | Configuration XML, charges utiles API, SVG, plans de site |
Un exemple concret rend la superposition claire Prenez un petit catalogue de livres où, entre deux versions, un livre' ; s catégorie attribut change de fiction à mystère, ce même livre' ; s prix texte change de 12.99 à 14.99, et le deuxième livre gagne un nouvel élément isbn. Une ligne diff signalerait les trois plus toute réindentation autour d'eux, mélangée ensemble La différence structurelle diff rapporte exactement trois différences : un attribut modifié au chemin de catégorie, un nœud de texte modifié au chemin de prix, et un élément ajouté au chemin isbn. Chacun est étiqueté avec son genre, de sorte que vous pouvez dire d'un seul coup d'œil que deux modifications étaient un rapport existant et une séparation.
L'outil regroupe également les résultats en onglets ajoutés, supprimés et modifiés avec un compte courant, afin que vous puissiez d'abord répondre à des questions grossières, telles que " ; est-ce que quelque chose a été supprimé," ; avant de percer dans les détails Sur un grand document, cet ordre compte : les suppressions sont souvent le changement le plus dangereux, car un élément abandonné peut supprimer silencieusement un champ requis, et pouvoir les isoler sans patauger dans des modifications sans rapport est un gain de temps réel.
Que signifie le chemin du nœud dans une différence ?
Chaque différence est étiquetée avec un chemin qui vous indique exactement où dans l'arborescence elle se trouve, de sorte que vous pouvez sauter vers elle au lieu de scanner le fichier Le chemin est construit à partir des noms d'éléments, rejoints par des barres obliques de la racine vers le bas Lorsqu'un élément a des frères et sœurs du même nom, un index à base unique entre parenthèses désambiguise lequel, donc /catalog/book[2] est le deuxième livre Un attribut est écrit avec un @ préfixe, comme dans /catalog/book[1]/@categoryet un changement de texte est marqué par text(), comme dans /catalog/book[2]/price/text().
Cette notation est volontairement proche de XPath(en), le langage W3 C pour adresser des nœuds dans un document XML, donc si vous avez déjà lu XPath les chemins vous sembleront familiers et vous pouvez souvent coller une expression similaire dans votre propre outillage pour sélectionner le même nœud Même sans connaître XPath, les chemins se lisent naturellement : les noms descendent dans l'arbre, les crochets sélectionnent un frère ou une sœur, @ est un attribut, et text() est le contenu.
Parce que le chemin nomme le genre de changement aussi, le rapport répond à trois questions à la fois : ce qui a changé, où il vit, et s'il s'agissait d'un élément, d'un attribut ou d'un texte Cela suffit généralement pour ouvrir le bon fichier et fixer la bonne ligne sans autre chasse.
Quand utiliserais-je réellement cela ?
La dérive de configuration est le cas que j'ai le plus touché Lorsqu'un service se comporte différemment entre deux environnements et que le seul suspect est une configuration XML, la comparaison des deux fichiers vous indique structurellement en quelques secondes si une valeur a véritablement changé ou si quelqu'un vient de reformater le fichier. Il en va de même pour créer et déployer des pipelines qui réécrivent XML, où vous devez confirmer qu'une transformation a changé uniquement ce qu'elle était censée faire.
API et travail d'intégration est le suivant Les réponses SOAP, les flux RSS et Atom, et les anciennes API REST parlent toujours XML, et lorsqu'une charge utile cesse d'analyser correctement une différence structurelle par rapport à un échantillon connu, identifie rapidement l'élément incriminé. SVG est XML aussi, donc comparer deux icônes exportées montre exactement quel chemin ou attribut un éditeur a modifié. Sitemaps, fichiers de mise en page Android, Maven POMs, et .docx les internes sont tous XML sous le capot, et tous bénéficient du même traitement Je construis sur la pile, et XML apparaît dans plus de coins que ce à quoi les gens s'attendent, c'est pourquoi cela vit à côté du Formateur XML et XML vers JSON dans mes signets J'ai esquissé comment ceux-ci s'adaptaient à un kit plus large dans le Guide JSON vers XML.
Il y a un angle de révision de code aussi Quand une requête pull touche un luminaire XML ou un fichier généré, la différence brute dans l'interface utilisateur de révision est souvent illisible parce qu'un formateur a réécrit le tout Exécuter l'avant et l'après par une comparaison structurelle, puis coller le rapport court dans la revue, indique à votre réviseur ce qui a réellement changé en un seul coup d'œil au lieu de lui demander de faire confiance à un mur de rouge L'outil' ; son rapport texte copiable existe exactement pour cela : un résumé compact de chaque nœud ajouté, supprimé et modifié avec ses valeurs avant et après, prêt à tomber dans un ticket, un message de validation ou un fil de discussion.
Les outils de comparaison voisins couvrent les cas XML diff ne. Lorsque vos données sont tabulaires, le CSV Diff compare les lignes et les cellules, et pour deux listes simples, le Liste Comparer l'outil définit des différences. Ils partagent la même philosophie : analyser d'abord les données dans leur forme naturelle, puis comparer, de sorte que la différence reflète le sens plutôt que la disposition.
Quelles sont les limites, et mon XML est-il privé ?
L'outil compare la structure, ce qui signifie qu'il ne signale délibérément pas les types de différences que la structure ne capture pas Réordonnancer deux attributs, changer l'indentation ou échanger la syntaxe auto-fermable sont tous traités comme aucun changement, par conception Si votre cas d'utilisation a vraiment besoin d'une comparaison exacte d'octets, un diff de texte est le bon outil et ce n'est pas le cas La diff structurelle associe également les éléments répétés par position, donc si les mêmes enregistrements sont mélangés dans un ordre différent, l'outil voit les déplacés comme modifiés plutôt que déplacés ; trier les deux documents par une clé stable en premier, lorsque cela a du sens, donne le résultat le plus propre.
XML mal formé est signalé plutôt que deviné à Si un document a une balise non-correspondante ou non-fermée, ou plus d'un élément racine, l'outil nomme le problème et vous indique de quel côté il vient, de sorte que vous n'obtenez jamais une diff trompeuse à partir d'une entrée cassée Il gère les constructions courantes du monde réel un analyseur doit : attributs dans des guillemets simples ou doubles, balises auto-fermables, sections CDATA, commentaires, instructions de traitement, et références d'entités standard comme < et &.
Sur la confidentialité, tout s'exécute dans votre navigateur Les deux documents sont analysés et comparés localement, et rien n'est téléchargé, enregistré ou stocké C'est la propriété qui permet de diff en toute sécurité une configuration de production, une charge utile API interne ou un fichier spécifique au client, dont aucun n'appartient à un serveur stranger' ; Le Confidentialité des données dans les outils en ligne guide explique comment vérifier qu'un outil est véritablement côté client, ce qui vaut la peine d'être fait avant de coller quoi que ce soit de sensible dans un outil Web.
Questions fréquentes
Comment comparer deux fichiers XML ?
Collez le XML original dans le premier champ et le XML modifié dans le second, puis appuyez sur Comparer L'outil analyse à la fois dans les arborescences de nœuds et répertorie chaque élément, attribut et valeur de texte ajouté, supprimé et modifié, chacun étant épinglé sur son chemin de nœud Rien n'est téléchargé.
En quoi un XML diff est-il différent d'un diff en texte brut ?
Une différence de texte compare les fichiers ligne par ligne, donc réindenter, réorganiser les attributs ou réemballer les lignes donne à presque tout l'air modifié. Une différence XML analyse d'abord les deux documents en arbres et les compare structurellement, elle ne rapporte donc que les différences qui modifieraient la façon dont un analyseur lit le document.
La réorganisation des attributs compte-t-elle comme un changement ?
Non. Les attributs sont comparés par nom quel que soit l'ordre dans lequel ils apparaissent dans la balise, car l'ordre des attributs n'est pas significatif en XML Seule une valeur modifiée, un attribut ajouté ou un attribut supprimé est signalé.
Comment les éléments répétés sont-ils appariés entre les deux documents ?
Les éléments enfants qui partagent un nom de balise sont appariés par leur ordre d'apparition, de sorte que le premier élément est comparé au premier élément, le deuxième au deuxième, et ainsi de suite Si un document a plus d'occurrences que l'autre, les extras sont signalés comme ajoutés ou supprimés.
Que signifie le chemin du nœud dans chaque différence ?
Le chemin indique où dans l'arborescence le changement est, en utilisant les noms des éléments, un index à base unique entre parenthèses lorsqu'il y a des frères et sœurs du même nom, @name pour un attribut et du texte () pour le contenu du texte. Par exemple, /catalog/book [2]/@id pointe vers l'attribut id du deuxième livre.
Les espaces ou le formatage affectent-ils la comparaison ?
Par défaut, le texte réservé aux espaces est ignoré et les séries d'espaces à l'intérieur du texte sont réduites, donc le reformatage du document ne crée pas de fausses différences. Vous pouvez vous fier à la comparaison structurelle plutôt qu'à la correspondance exacte de l'indentation.
Que se passe-t-il si le XML est mal formé ?
L'outil signale une erreur claire nommant le problème, comme une balise non adaptée ou non fermée, et vous indique de quel document il provient Il ne devine pas une réparation, de sorte que vous n'obtenez jamais une différence trompeuse à partir d'une entrée cassée.
Mes documents XML sont-ils téléchargés quelque part ?
Non. Toute analyse et comparaison se font sous forme de JavaScript dans votre navigateur. Rien n'est transmis, enregistré ou stocké. Vous pouvez le confirmer en regardant l'onglet réseau ou en vous déconnectant d'Internet, l'outil continue de fonctionner hors ligne.
Comparez vos propres documents avec le gratuit Vérificateur de différence XML. Il signale les différences structurelles par chemin de nœud, entièrement dans votre navigateur, sans rien téléchargé.



