Comparaison de documents XML [Résolu]

Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
- - Dernière réponse : Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
- 17 janv. 2006 à 15:32
Bonjour tout les monde,


J'ai deux documents XML, qui sont chargés dans des objets dans des objets de types XmlDocument. Je dois comparer s'il y a des différences
entre ces deux documents et connaître lesquelles.
J'ai lu qu'il y avait une méthode Equals() qui permettait de dire si oui ou non, deux objets sont identiques!
Mais pour comparer les différences entre deux documents je n'ai rien trouvé!
Est-ce quelqu'un saurait comment faire?


Merci pour votre aide!


Cédric
Afficher la suite 

Votre réponse

16 réponses

Meilleure réponse
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
3
Merci
Salut Trambert,

en fait pout répondre à ton premier messager, j'ai fait comme ceci pour comparer si le contenu de mes documents XML sont identiques ou non.

str1 = doc1.OuterXml;
str2 = doc2.OuterXml;
if (str1.CompareTo(str2)==0)
{
//document identique
...
}
else
{
//pas identique, alors parcourir les document XML
....
}



Ensuite si mes documents ne sont identique, je parcours mes deux documents XML et compare chaque noeud si leur contenu sont identique ou non et si leur structure est identique ou non (même nom de noeud et même nombre d'attribut).

Enfin j'ai résolu mon problème est résolu, merci à tous pour votre aide et vos conseil!

Cédric

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 106 internautes ce mois-ci

Commenter la réponse de Verrisan
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Ouvre tes documents, lis-les ligne par ligne, et compare chaque ligne lue.

Dès que 2 lignes sont différentes, tu sais où les localiser

Mx
Commenter la réponse de MorpionMx
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Dernière intervention
26 décembre 2007
0
Merci
Parcours noeud par noeud plutot :)

::|The S@ib|::
MVP C#.NET
Commenter la réponse de TheSaib
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
0
Merci
OK, c'est vrai que l'on peut parcourir chaque élément de chaque XmlDocument, mais si c'est de gros document XML, cela pourrait prendre beaucoup de temps.
En fait, je voulais savoir s'il y avait d'autres moyens plus rapide rapide de comparer deux documents XML et de connaître quelles sont ces différences?
(Est-ce qu'il y a d'autres classes qui seraient meilleures au points de vue performances que XmlDocument pour comparer deux chaines de caractères sous format XML)


Merci pour votre aide!


Cédric
Commenter la réponse de Verrisan
Messages postés
1025
Date d'inscription
mardi 4 février 2003
Dernière intervention
7 juin 2010
0
Merci
Hello,

Essaie avec XmlDocument.OuterXml,
ça renvoie un string et tu compare les string, tu vois s'il y a une différence, pour voir où, c'est une autre histoire.

Amicalement, SharpMao
Commenter la réponse de SharpMao
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Dernière intervention
10 février 2009
0
Merci
Salut, je choisirai un mix des deux méthodes : d'abord une comparaison
des strings puis une comparaison neuds par neuds. Je pense que la
comparaison des strings doit être plus rapide, ce qui te fera gagner du
temps dans les cas où il n'y pas d'erreur.
Commenter la réponse de t_barbillon
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Oui TheSaib tu as raison, noeud par noeud c'est pas plus bete pour un doc xml.

Cependant, il ne nous indique pas que les 2 docs peuvent avoir une
structure identique, alors je trouvais que le ligne par ligne pouvait
etre + approprié. Et puis plus simple a mettre en oeuvre aussi.

Mx
Commenter la réponse de MorpionMx
Messages postés
2369
Date d'inscription
mardi 17 avril 2001
Dernière intervention
26 décembre 2007
0
Merci
Si il ont pas une structure identique alors ils sont différents :) C'est ce qu'ils cherche a savoir !

::|The S@ib|::
MVP C#.NET
Commenter la réponse de TheSaib
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Ha voui, je pensais que tu disais plutot au niveau des valeurs.

Suis a coté de la plaque

Mx
Commenter la réponse de MorpionMx
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
0
Merci
Ok MX, pour comparer des chaines de caractmèrs, j'ai lu qu'il y a deux méthodes Equals() ou comporteTo() pour string, par contre pour des lignes dans un string, je ne l'ai jamais fait, est-ce que la méthode getEnumerator() de la classe serait appropriée?


Merci pour l'aide!


Cédric
Commenter la réponse de Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
0
Merci
Excusez-moi MX et TheSaib, je n'ai pas lu vos derniers messages! Mais pour votre info, j'ai besoin de connaître si la structure et/ou les valeurs à l'intérieur des balises ont changé (donc MX, tu n'es pas à coôté de la plaque).


Merci pour votre aide et vos conseils!


Cédric
Commenter la réponse de Verrisan
Messages postés
3489
Date d'inscription
lundi 16 octobre 2000
Dernière intervention
30 octobre 2008
0
Merci
Sisi, je suis a coté de la plaque.

Moi je pensais au début que tu souhaitais faire de la comparaison de
documents, comme on pourrait comparer 2 docs words. (espace en plus, ou
sauts a la ligne. Des différences dans ce sens là quoi)



Pour ce que tu demandes, je suis pas des plus a l'aise pour faire ca,
je vais laisser quelqu'un te repondre a ma place, je risquerais de pas
te donner la bonne méthode.

Mx
Commenter la réponse de MorpionMx
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Dernière intervention
13 août 2007
0
Merci
Pis si tu fais comme l'a dit 46230 SharpMao
xmlDoc1.OuterXml == xmlDoc2.OuterXml;
ça répond à ton problème?

-------------------------
Trambert le vert
Commenter la réponse de bucherb
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Dernière intervention
13 août 2007
0
Merci
Ok désolé chuis aussi à côté de la plaque, t'arrivera pas à localiser les infos comme ça...

Mais tu peux effectivement parcourir noeud par noeud et à chaque fois soit utiliser la liste des attributs pour comparer, soit utiliser OuterXml.

-------------------------
Trambert le vert
Commenter la réponse de bucherb
Messages postés
1
Date d'inscription
lundi 9 janvier 2006
Dernière intervention
9 janvier 2006
0
Merci
Salut Cédric!

je doit effectué un projet et ta fonction de comparaison de 2
fichiers XML serai tres intéressant pour une fonctionnalité de mon
outil.

Serait-il possible que tu m'envoit le code source de ta comparaison de noeud et de structure de 2fichiers XML?



je te remercie d'avance

tcheng
Commenter la réponse de cs_tcheng
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Dernière intervention
23 décembre 2013
0
Merci
Salut Tcheng,

Excuse-moi pour ma réponse tardive, mais je n'ai lu ta question que hier!!!

Voici l'exemple de code que j'ai réalisé par rapport au problème que j'avais pour comparer deux documents XML. Il y a peut être maintenant d'autres façons de faire plus effacice!!! Si tu en trouves je serai également intéressé de la connaître.

Voici le code:
....
XmlDocument doc1 = new XmlDocument();
XmlDocument doc2 = new XmlDocument();
doc1.LoadXml("<Name>Rey</Name><FirstName>Jacques</FirstName>35

<Street>Rue de la Gare</Street><City np='3003'>Berne</City>

");
doc2.LoadXml("<Name>Rey</Name><FirstName>Jacques</FirstName>40

<Rue>Rue de la Gare</Rue><City>Berne</City>

");
string str1 = doc1.OuterXml;
string str2 = doc2.OuterXml;
if (str1.CompareTo(str2) == 0)
{
  //document identique
  Console.WriteLine("Document identique");
}
else
{
//pas identique, alors parcourir les document XML
XmlNode root1 = doc1.DocumentElement;
XmlNode root2 = doc2.DocumentElement;

while ((root1 != null) && (root2 != null))
{
  if (root1.InnerXml != root2.InnerXml)
    {
     Console.WriteLine("Contenu des noeuds '" + root1.Name + "' différent");
    }
  if (root1.Name != root2.Name)
    {
     Console.WriteLine("Nom de noeud différent: " + root1.Name+ " - "+ root2.Name);
    }
  if (root1.Attributes.Count != root2.Attributes.Count)
    {
      Console.WriteLine("Nombre d'attributs différents: "+root1.Name);
    }
  else
    {
      //Comparer le contenu de chaque attribut
      XmlAttributeCollection att1 = root1.Attributes;
      XmlAttributeCollection att2 = root2.Attributes;

      if ((att1 != null) && (att2 != null))
        {
         int ind = 0;
         while (ind < att1.Count)
              {
               if (att1[ind].InnerXml != att2[ind].InnerXml)
                 {
                   Console.WriteLine("Le contenu des attributs:'" + att1[ind].Name + "' est différent");
                 }
                 ind = ind + 1;
              }
        }
     }

   if (root1.FirstChild.NodeType == XmlNodeType.Element)
     {
      root1 = root1.FirstChild;
     }
   else
     {
      if (root1.NextSibling == null)
        {
         root1 = root1.ParentNode.NextSibling;
        }
       else
        {
         root1 = root1.NextSibling;
        }

      }

      if (root2.FirstChild.NodeType == XmlNodeType.Element)
        {
         root2 = root2.FirstChild;
        }
       else
        {
         if (root2.NextSibling == null)
           {
            root2 = root2.ParentNode.NextSibling;
           }
         else
           {
            root2 = root2.NextSibling;
           }

        }
   }
}
....


J'espère que cela pourra t'aider à résoudre ton problème!

Cédric
Commenter la réponse de Verrisan

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.