Comment voulez-vous comparer les deux Documents XML?
Dans le cadre de la classe de base pour un large panel de tests unitaires, je suis en train d'écrire une fonction d'assistance de manière récursive qui compare les noeuds d'un objet XmlDocument à l'autre en C# (.NET). Certaines exigences de ce:
- Le premier document est le source, par exemple, ce que je veux le document XML ressembler. Ainsi, le second est celui que je veux trouver des différences et il ne doit pas contenir de supplémentaire noeuds, et non dans le premier document.
- Doit lancer une exception lorsqu'un trop grand nombre de différences significatives sont trouvées, et il doit être facilement compréhensible par un humain jetant un coup d'oeil à la description.
- Enfant de l'élément de commande est important, les attributs peuvent être dans n'importe quel ordre.
- Certains attributs sont ignorable; plus précisément
xsi:schemaLocation
etxmlns:xsi
, mais je voudrais être en mesure de passer dans celles qui le sont. - Préfixes d'espaces de noms doivent correspondre à la fois les attributs et les éléments.
- Les espaces entre les éléments n'est pas pertinent.
- Éléments soit ont des éléments d'enfant ou
InnerText
, mais pas les deux.
Alors que je suis à la démolition de quelque chose ensemble: quelqu'un a écrit un tel code et serait-il possible de le partager ici?
Sur un côté, que feriez-vous appel le premier et le second documents? J'ai été en se référant à eux en tant que "source" et "cible", mais il se sent mal depuis le source est ce que je veux le cible ressembler, sinon je lève une exception.
- Peut les nœuds être le même, mais être déclarée dans un ordre différent?
- Non, les nœuds doivent être dans le même ordre. En plus d'être une exigence des documents eux-mêmes, il permet de différenciation, un peu plus simple (juste énumérer les enfants et les vérifier un à un).
- > les attributs peuvent être dans n'importe quel ordre Bonne chose, parce que les attributs sont non ordonnée par définition.
- J'appelle les documents, "de base" et "test".
- double possible de Quelle est la meilleure façon de comparer des fichiers XML pour l'égalité?
Vous devez vous connecter pour publier un commentaire.
Microsoft a un XML diff API que vous pouvez utiliser
J'ai googlé une liste plus complète de solutions de ce problème aujourd'hui, je vais essayer l'un d'eux bientôt:
essayer XMLUnit. Cette bibliothèque est disponible pour Java et en .Net
La comparaison des documents XML est compliqué. Google pour xmldiff (il y a même une solution de Microsoft) pour certains outils. J'ai résolu ce problème de deux manières. J'ai utilisé XSLT pour trier les éléments et les attributs (parce que parfois, ils apparaissent dans un ordre différent, et je n'ai pas de soins à ce sujet), et de filtrer les attributs que je ne veux pas comparer, puis utilisé le XML::Diff ou XML::SemanticDiff module perl, ou de jolis imprimés chaque document avec chaque élément et attribut sur une ligne distincte, et en utilisant la ligne de commande Unix diff sur les résultats.
Ce code n'est pas satisfaire à toutes vos exigences, mais il est simple et que j'utilise pour mes tests unitaires. Ordre des attributs n'a pas d'importance, mais l'élément de commande n'. Élément de texte interne n'est pas contre. J'ai aussi ignoré cas lorsque l'on compare les attributs, mais vous pouvez facilement le supprimer.
Je suis en utilisant ExamXML pour comparer des fichiers XML. Vous pouvez l'essayer.
Les auteurs, A7Soft, offrent également des API pour comparer des fichiers XML
https://github.com/CameronWills/FatAntelope
Une autre bibliothèque alternative à Microsoft XML Diff API. Il a un XML algorithme de comparaison à faire un non-ordonnée de la comparaison de deux documents XML et de produire un appariement optimal.
C'est un C# port de la X-Diff algorithme décrit ici:
http://pages.cs.wisc.edu/~yuanwang/xdiff.html
Avertissement: je l'ai écrit 🙂
Une autre façon de le faire serait -
Ce ne sera pas vous donner l'emplacement exact de la différence, mais si vous voulez simplement savoir si il y a une différence, c'est facile à faire, sans aucune des bibliothèques tierces.
Pas pertinentes pour l'OP car actuellement, il ignore enfant commande, mais si vous voulez un code unique solution, vous pouvez essayer XmlSpecificationCompare qui je un peu misguidedly développé.
Pour la comparaison de deux sorties XML dans les tests automatisés j'ai trouvé
XNode.DeepEquals
.Utilisation:
Référence: https://docs.microsoft.com/en-us/dotnet/api/system.xml.linq.xnode.deepequals?view=netcore-2.2
En fonction @Deux Cents réponse et à l'aide de ce lien XMLSorting j'ai créé mon propre XmlComparer
Comparer XML programme
Sorte XML programme
J'ai écrit ce XSLT 1.0 en fonction de comparaison de la feuille que vous comparez b.xml à l'entrée xml en sortie de différences d'éléments dans l'entrée qui ne sont pas dans b.xml.
https://github.com/sflynn1812/xslt-diff