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
A voir également:

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 2367 Date d'inscription mardi 17 avril 2001 Statut Membre 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 69
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 2367 Date d'inscription mardi 17 avril 2001 Statut Membre 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
Rejoignez-nous