Sous Linux, comment générer un diff entre deux fichiers XML?
Idéalement, j'aimerais pouvoir le configurer sur certaines choses strictes ou desserrer certaines choses, telles que les espaces ou l'ordre des attributs.
Je veillerai souvent à ce que les fichiers soient fonctionnellement identiques, mais les diffs par eux-mêmes seraient gênants à utiliser, surtout si le fichier XML ne comporte pas beaucoup de sauts de ligne.
Par exemple, ce qui suit devrait vraiment me convenir:
<tag att1="one" att2="two">
content
</tag>
<tag att2="two" att1="one">
content
</tag>
vimdiff <(xmllint --c14n one.xml) <(xmllint --c14n two.xml)
La réponse de Jukka ne fonctionnait pas pour moi, mais elle renvoyait au code XML canonique. Ni --c14n ni --c14n11 ne trièrent les attributs, mais j’ai trouvé que le commutateur --exc-c14n triait les attributs. --exc-c14n ne figure pas dans la page de manuel, mais est décrit sur la ligne de commande comme étant "format canonique exclusif du W3C".
Avertissement --exc-c14n supprime l'en-tête xml alors que --c14n ajoute l'en-tête xml s'il n'y est pas.
la source
J'ai essayé d'utiliser la réponse de @Jukka Matilainen, mais j'avais des problèmes d'espace blanc (l'un des fichiers était une énorme doublure). L'utilisation
--format
aide à ignorer les différences d'espaces.Remarque: Utilisez la
vimdiff
commande pour comparer côte à côte les fichiers XML.la source
two.xml
été généréone.xml
par un script. Je devais donc simplement vérifier ce qui était ajouté / supprimé par le script.--format
avec--exc-c14n
; sera probablement encore plus lent à traiter :(--exc-c14n
option spécifie le tri des attributs. Dans vos fichiers spécifiques, les attributs étaient probablement déjà triés, mais le conseil général serait d'utiliser la combinaison--format --exc-c14n
.Diffxml obtient la fonctionnalité de base correcte, bien qu'elle ne semble pas offrir beaucoup d'options de configuration.
Edit: Project Diffxml a été migré vers GitHub depuis 2013.
la source
Si vous souhaitez également ignorer l'ordre des éléments enfants, j'ai écrit un outil python simple appelé
xmldiffs
:Obtenez-le à l' adresse https://github.com/joh/xmldiffs
la source
Mon script Python xdiff.py pour la comparaison de fichiers XML ignore les différences d'espaces ou d'ordre d'attributs (contrairement à l'ordre des éléments).
Pour comparer deux fichiers
1.xml
et2.xml
exécuter le script, procédez comme suit:Dans l'exemple du PO, il ne produirait rien et renverrait le statut de sortie
0
(sans différences structurelles ou textuelles).Dans les cas où
1.xml
et2.xml
diffère structurellement, il imite la sortie unifiée du diff GNU et renvoie le statut de sortie1
. Il existe diverses options pour contrôler la sortie, telles que la-a
sortie de tout le contexte, la-n
sortie sans contexte et la-q
suppression complète de la sortie (tout en retournant le statut de sortie).la source
J'utilise Beyond Compare pour comparer tous les types de fichiers texte. Ils produisent des versions pour Windows et Linux.
la source
Notre SD Smart Differencer compare les documents en fonction de la structure et non de la présentation réelle.
Il y a un Smart Differencer XML. Pour XML, cela signifie un ordre de correspondance des balises et du contenu. Il convient de noter que la chaîne de texte dans le fragment spécifique que vous avez indiqué était différente. Actuellement, il ne comprend pas la notion XML d'attributs de balises indiquant si les espaces sont normalisés ou significatifs.
la source
Je ne suis pas sûr que la dépendance d'un outil en ligne compte comme une solution, mais j'ai obtenu de bons résultats avec cet outil de comparaison XML en ligne . Cela fonctionne simplement.
la source