2017-01-08 4 views
-1

Tous,C#: modifications dans un fichier XML Détection document

Je reçois un document XML à partir d'un appareil, que je dois télécharger un webservice, si le doc XML a changé de l'ancien. Je ne me soucie pas de ce qui a changé dans le document XML, la seule chose qui m'importe, c'est le changement. Je sondage pour ce document de l'appareil toutes les 10 secondes et si elle a changé de l'ancienne, je télécharge sur un service web. Je n'ai pas de schéma pour ce document, donc je ne peux pas sérialiser ce document. Dans ce cas, quelle est la meilleure pratique pour détecter qu'un document XML a changé par rapport à un document précédent. J'utilise C# 6.0 pour le développement.

J'ai vu beaucoup de recommandations sur XML diff, mais je suis à la recherche d'une meilleure pratique et je ne veux pas trop tuer mon implémentation.

merci!

+0

Quelle est la taille du document? Je suppose que trop gros pour utiliser String.Equals? – Chris

+1

@Chris La prise en compte du "sondage pour ce document à partir du périphérique toutes les 10 secondes" n'est probablement pas le problème. Peut-être, il y a quelque chose avec la sérialisation sur l'appareil qu'il peut produire les mêmes données, mais avec des espaces supplémentaires et un ordre d'éléments différent, et qui empêche les approches de comparaison directe. –

+1

@EugenePodskal: C'est vrai. J'avais supposé que le document était généré par la même chose à chaque fois afin que les choses comme les espaces blancs ne changent pas, mais vous pourriez bien avoir raison. Parfois, bien que les gens négligent les options simples, il vaut toujours la peine de demander. – Chris

Répondre

1

Résolu le problème en utilisant "XMLDiffPatch". C'était plutôt simple.

XmlDiff xmldiff = new XmlDiff(XmlDiffOptions.IgnoreChildOrder | 
            XmlDiffOptions.IgnoreNamespaces | 
            XmlDiffOptions.IgnorePrefixes); 
    bool bIdentical = xmldiff.Compare(originalFile, newFile, null); 

Un bon article dans msdn

1

Vous pouvez toujours utiliser www.xmlunit.org

utiliser Plus précisément, le https://github.com/xmlunit/user-guide/wiki/Comparing-XML

système diff de xmlunit se décompose tout le processus de comparaison entre deux morceaux de XML en parties atomiques. Chacune de ces parties est représentée comme une comparaison. Une comparaison encapsule un type de comparaison comme "le nom d'un élément XML", "le nombre de nœuds enfants" ou "la valeur d'un attribut" et les deux pièces à comparer - ces deux pièces sont appelées Détails dans ce contexte et connaître les noeuds DOM qui sont comparés ainsi que l'emplacement XPath desdits noeuds dans leurs documents respectifs et la valeur WRT aux comparaisons à portée de main. Pour "le nom d'un élément XML" ou "le nombre de nœuds enfants", les nœuds DOM seraient des nœuds d'élément et les valeurs seraient respectivement le QName/XmlQualifiedName de l'élément ou un nombre.

Une comparaison ne sait que ce qui est comparé, elle ne détermine pas si les valeurs sont égales ou différentes. C'est à DifferenceEngine ou plutôt à DifferenceEvaluator de décider.

Une différence combine une comparaison avec la décision de DifferenceEvaluator. Dans la plupart des situations où les objets Différence font partie de l'API XMLUnit, il est supposé que la comparaison n'a pas conduit à un résultat EQUAL, d'où le nom.

Un Diff est le résultat global de la comparaison de deux morceaux de XML, c'est une enveloppe autour d'une collection potentiellement vide de Différences.

final String control = "<a><b attr=\"abc\"></b></a>"; 
final String test = "<a><b attr=\"xyz\"></b></a>"; 

Diff myDiff = DiffBuilder.compare(Input.fromString(control)) 
       .withTest(Input.fromString(test)) 
       .build(); 

Assert.assertFalse(myDiff.toString(), myDiff.hasDifferences()); 

https://github.com/xmlunit/user-guide/wiki/DiffBuilder