Comparaison de documents XML [Résolu]

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

16 réponses

Répondre au sujet
Verrisan 59 Messages postés mardi 21 novembre 2000Date d'inscription 23 décembre 2013 Dernière intervention - 4 nov. 2005 à 21:13
+3
Utile
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
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de Verrisan
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 2 nov. 2005 à 17:34
0
Utile
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
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 2 nov. 2005 à 23:22
0
Utile
Parcours noeud par noeud plutot :)

::|The S@ib|::
MVP C#.NET
Commenter la réponse de TheSaib
Verrisan 59 Messages postés mardi 21 novembre 2000Date d'inscription 23 décembre 2013 Dernière intervention - 3 nov. 2005 à 07:53
0
Utile
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
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 3 nov. 2005 à 08:39
0
Utile
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
t_barbillon 341 Messages postés mercredi 8 juin 2005Date d'inscription 10 février 2009 Dernière intervention - 3 nov. 2005 à 09:02
0
Utile
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 3 nov. 2005 à 09:27
0
Utile
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
TheSaib 2369 Messages postés mardi 17 avril 2001Date d'inscription 26 décembre 2007 Dernière intervention - 3 nov. 2005 à 10:07
0
Utile
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 3 nov. 2005 à 10:09
0
Utile
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
Verrisan 59 Messages postés mardi 21 novembre 2000Date d'inscription 23 décembre 2013 Dernière intervention - 3 nov. 2005 à 11:08
0
Utile
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
Verrisan 59 Messages postés mardi 21 novembre 2000Date d'inscription 23 décembre 2013 Dernière intervention - 3 nov. 2005 à 11:27
0
Utile
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
MorpionMx 3489 Messages postés lundi 16 octobre 2000Date d'inscription 30 octobre 2008 Dernière intervention - 3 nov. 2005 à 11:31
0
Utile
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
bucherb 412 Messages postés lundi 26 mai 2003Date d'inscription 13 août 2007 Dernière intervention - 4 nov. 2005 à 10:17
0
Utile
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
bucherb 412 Messages postés lundi 26 mai 2003Date d'inscription 13 août 2007 Dernière intervention - 4 nov. 2005 à 10:19
0
Utile
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
cs_tcheng 1 Messages postés lundi 9 janvier 2006Date d'inscription 9 janvier 2006 Dernière intervention - 9 janv. 2006 à 12:42
0
Utile
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
Verrisan 59 Messages postés mardi 21 novembre 2000Date d'inscription 23 décembre 2013 Dernière intervention - 17 janv. 2006 à 15:32
0
Utile
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.