Comparaison de documents XML

Résolu
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013
- 2 nov. 2005 à 17:13
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
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

16 réponses

Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013

4 nov. 2005 à 21:13
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
3
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
57
2 nov. 2005 à 17:34
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
0
TheSaib
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
23
2 nov. 2005 à 23:22
Parcours noeud par noeud plutot :)

::|The S@ib|::
MVP C#.NET
0
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013

3 nov. 2005 à 07:53
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
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
SharpMao
Messages postés
1024
Date d'inscription
mardi 4 février 2003
Statut
Membre
Dernière intervention
7 juin 2010
67
3 nov. 2005 à 08:39
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
0
t_barbillon
Messages postés
341
Date d'inscription
mercredi 8 juin 2005
Statut
Membre
Dernière intervention
10 février 2009
2
3 nov. 2005 à 09:02
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.
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
57
3 nov. 2005 à 09:27
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
0
TheSaib
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
23
3 nov. 2005 à 10:07
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
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
57
3 nov. 2005 à 10:09
Ha voui, je pensais que tu disais plutot au niveau des valeurs.

Suis a coté de la plaque

Mx
0
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013

3 nov. 2005 à 11:08
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
0
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013

3 nov. 2005 à 11:27
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
0
MorpionMx
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
57
3 nov. 2005 à 11:31
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
0
bucherb
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

4 nov. 2005 à 10:17
Pis si tu fais comme l'a dit 46230 SharpMao
xmlDoc1.OuterXml == xmlDoc2.OuterXml;
ça répond à ton problème?

-------------------------
Trambert le vert
0
bucherb
Messages postés
412
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
13 août 2007

4 nov. 2005 à 10:19
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
0
cs_tcheng
Messages postés
1
Date d'inscription
lundi 9 janvier 2006
Statut
Membre
Dernière intervention
9 janvier 2006

9 janv. 2006 à 12:42
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
0
Verrisan
Messages postés
59
Date d'inscription
mardi 21 novembre 2000
Statut
Membre
Dernière intervention
23 décembre 2013

17 janv. 2006 à 15:32
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
0