IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XML/XSL et SOAP Discussion :

[DOM] comparer 2 fichiers xml


Sujet :

XML/XSL et SOAP

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut [DOM] comparer 2 fichiers xml
    Bonjour, dans le cadre de mon stage, je dois comparer 2 fichiers de configurations xml de type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    		<PARAMETER NAME="ModuleList" TYPE="DICO">
    		<PARAMETER NAME="Client" TYPE="STRING" VALUE="xx"/>
    		<PARAMETER NAME="DicoMo" TYPE="STRING" VALUE="xx"/>
    		<PARAMETER NAME="Filter" TYPE="STRING" VALUE="xxx"/>
    Je n'ai aucune idée de comment parser les confs, le but final étant de pouvoir afficher : les paramètres identiques / différents et/ou absents entre 2 conf xml

    Quelqu'un à une idée ?

  2. #2
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Tu fais ça en quel langage ?
    Et tu utilises quelle techno DOM, SAX, autre ?

    ERE

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut
    re,

    c'est en php

    j'ai avancé et trouvé la solution, néanmoins j'aimerai afficher mon résultat dans un tableau, et mon 'return $result;' ne me renvois que la fin, je sais pas pourquoi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
      $dom = new DomDocument();
      $dom->load('cfg/xxx.xml');
      $racine = $dom->documentElement;
      $result = array();
      parsing_xml($racine,'',$result);
      print_r($result);
     
      function parsing_xml($noeud,$chemin,&$result) {
    	$chemin .= '@'.$noeud->nodeName;
    	if ($noeud->hasAttributes()) {
    		foreach($noeud->attributes as $attribut) {
    			echo $chemin.'@'.$attribut->name.' = '.$attribut->value.'<br />';
    			$result['xml'][$chemin.'@'.$attribut->name] = $attribut->value;
    		}
    	}
    	if ($noeud->hasChildNodes()) {
    		foreach($noeud->childNodes as $fils) {
    			$result = parsing_xml($fils,$chemin,$result);
    		}
    	}
    	return $result;
      }

  4. #4
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Dans ta récursivité, il faut que tu ajoutes le retour de parsing_xml à $result:
    A peu de choses prêt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if ($noeud->hasChildNodes()) {
       foreach($noeud->childNodes as $fils) {
          //$result = parsing_xml($fils,$chemin,$result);
         $result = array_merge($result, parsing_xml($fils,$chemin,$result));
       }
    }
    ERE

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut
    salut ERE, j'ai testé ta réponse. Cette dernière m'affiche la même chose au niveau du résultat.

    obtient un truc comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Array ( [xml] => Array ( [@Proxy@schemaLocation] => xxx
    [...]
    [@Proxy@PARAMETER@PARAMETER@TYPE] => xxx ))
    Le problème étant, que ce qu'il met dans l'Array, correspond seulement à la fin du fichier.

  6. #6
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Oups, je n'avais pas fait attention : quand tu passes dans:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $result['xml'][$chemin.'@'.$attribut->name] = ...
    la valeur reste identique car tu conserve le même chemin au sein d'un même niveau de l'arborescence.
    Donc tu dois distinguer tes noeuds. Je t'ai modifié ton code de façon basique en injectant un compteur. Au passage j'ai enlevé la récursivité que j'avais mise précédemment, cela se rapproche plus de l'esprit initial de ton ceode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    $dom = new DomDocument();
      $dom->load('xml01.xml');
      $racine = $dom->documentElement;
      $result = array();
      $result = parsing_xml($racine,'',$result);
      print_r($result);
      $i=0;
      function parsing_xml($noeud,$chemin, &$result) {
      	global $i;
      	$chemin .= '@'.$noeud->nodeName;
    	if ($noeud->hasAttributes()) {
    		foreach($noeud->attributes as $attribut) {
    			echo $chemin.'@'.$attribut->name.' = '.$attribut->value.'<br />';
    			$i++;
    			$result['xml'][$chemin.'@'.$attribut->name.$i] = $attribut->value;
    		}
    	}
    	if ($noeud->hasChildNodes()) {
    		foreach($noeud->childNodes as $fils) {
    			parsing_xml($fils,$chemin,$result);
    		}
    	}
    	return $result;
      }
    ERE

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut
    ca marche bien

    mais j'arrive au point de non retour lol. car si je veux comparer 2 conf xml, la conf comparée à la premiere n'aura pas forcément les même noeuds, ni les mêmes compteurs au niveau des noeuds.

    Je pense que cela est impossible, il va me falloir trouver une autre méthode pour comparer les conf xml .

    en tout cas merci pour ton aide, même si ce que je veux faire n'est surement pas possible au final, tu auras réussis à résoudre mon problème initial !

  8. #8
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut
    Citation Envoyé par ben7875 Voir le message
    ca marche bien

    mais j'arrive au point de non retour lol. car si je veux comparer 2 conf xml, la conf comparée à la premiere n'aura pas forcément les même noeuds, ni les mêmes compteurs au niveau des noeuds.

    Je pense que cela est impossible, il va me falloir trouver une autre méthode pour comparer les conf xml .

    en tout cas merci pour ton aide, même si ce que je veux faire n'est surement pas possible au final, tu auras réussis à résoudre mon problème initial !
    Tu devrais peut-être passé plutôt par des requêtes XPath qui te permettraient de t'affranchir de l'arborescence et de tester plus rapidement l'existence d'un paramètre dans le second fichier, ...

    ERE

  9. #9
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut
    j'ai regardé les requêtes XPath, mais je suis septique à l'idée de me pencher dessus.

    J'ai eu des nouvelles instructions concernant mon probleme, en effet l'histoire des noeuds identiques ne tenait pas debout. On me demande alors d'ignorer les TYPE =

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    		<PARAMETER NAME="2" TYPE="DICO">
    			<PARAMETER NAME="Type" TYPE="STRING" VALUE="xxxServer"/>
    			<PARAMETER NAME="Name" TYPE="STRING" VALUE="xxxServer"/>
    		</PARAMETER>
    Donc je me suis dit qu'il suffit de faire un 'hasAttributes(NAME)' mais je ne sais pas comment le coder pour que ca marche, pourrais-tu m'aider ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    <?php
      $dom = new DomDocument();
      $dom->load('cfg/xxx.xml');
      $racine = $dom->documentElement;
      $result = array();
      parsing_xml($racine,'',$result);
      print_r($result);
     
     
      function parsing_xml($noeud,$chemin,&$result) {
    	$chemin .= '@'.$noeud->nodeName;
    	if ($noeud->hasAttributes('NAME')) {
     
    		foreach($noeud->attributes as $attribut) {
    			echo $chemin.'@'.$attribut->name.' = '.$attribut->value.'<br />';
    			$result['xml'][$chemin.'@'.$attribut->name] = $attribut->value;
    		}
    	}
    	if ($noeud->hasChildNodes()) {
    		foreach($noeud->childNodes as $fils) {
    			$result = parsing_xml($fils,$chemin,$result);
    		}
    	}
    	return $result;
      }
     
    ?>

  10. #10
    Membre Expert
    Avatar de emmanuel.remy
    Inscrit en
    Novembre 2005
    Messages
    2 855
    Détails du profil
    Informations personnelles :
    Âge : 56

    Informations forums :
    Inscription : Novembre 2005
    Messages : 2 855
    Par défaut Une idée...
    Avec ce type de structure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <root>
    		<PARAMETER NAME="ModuleList" TYPE="DICO" >
    			<PARAMETER NAME="Client" TYPE="STRING" VALUE="c1"/>
    			<PARAMETER NAME="DicoMo" TYPE="STRING" VALUE="dm1"/>
    			<PARAMETER NAME="Filter" TYPE="STRING" VALUE="f1"/>
    			<PARAMETER NAME="DirectoryList" TYPE="DICO" >
    				<PARAMETER NAME="adresse 1" TYPE="STRING" VALUE="Paris"/>
    				<PARAMETER NAME="adresse 2" TYPE="STRING" VALUE="Marseille"/>
    				<PARAMETER NAME="adresse 3" TYPE="STRING" VALUE="Lille"/>
    			</PARAMETER>
    		</PARAMETER>
    		<PARAMETER NAME="Fournisseur" TYPE="STRING" VALUE="Developpez"/>
    		<PARAMETER NAME="Taux" TYPE="NUMERIC" VALUE="12.5"/>
    </root>
    ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    <?php
      $dom = new DomDocument();
      $dom->load('xml01.xml');
      $racine = $dom->documentElement;
      $result = array();
      $result = parsing_xml($racine,'',$result);
      print_r($result);
     
      function parsing_xml($noeud,$chemin, &$result) {
      	if ($noeud->nodeName=="PARAMETER" && $noeud->hasAttribute('NAME') && !$noeud->hasAttribute('VALUE')) {
      		$chemin .= '/'.$noeud->getAttribute('NAME');
      	}
     
    	if ($noeud->hasAttribute('NAME') && $noeud->hasAttribute('VALUE')) {
    			$result['xml'][$chemin.'/'.$noeud->getAttribute('NAME')] = $noeud->getAttribute('VALUE');
    	}
    	elseif ($noeud->hasChildNodes()) {
    		foreach($noeud->childNodes as $fils) {
    			if ($fils->nodeType==XML_ELEMENT_NODE) parsing_xml($fils,$chemin,$result);
    		}
    	}
    	return $result;
      }
    ?>
    Tu obtiens cela:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    Array
    (
        [xml] => Array
            (
                [/ModuleList/Client] => c1
                [/ModuleList/DicoMo] => dm1
                [/ModuleList/Filter] => f1
                [/ModuleList/DirectoryList/adresse 1] => Paris
                [/ModuleList/DirectoryList/adresse 2] => Marseille
                [/ModuleList/DirectoryList/adresse 3] => Lille
                [/Fournisseur] => Developpez
                [/Taux] => 12.5
            )
     
    )
    Cela reste dans ton esprit

    ERE

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Mars 2009
    Messages
    52
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Mars 2009
    Messages : 52
    Par défaut emmanuel.remy : UN GRAND MERCI
    ERE pour ton aide qui m'a été fort utile, grâce à toi j'arrive à mes fin avec des fichiers de configurations xml.

    Tout marche bien et le résultat que je voulais fonctionne à merveille!

    TOPIC

  12. #12
    Membre du Club
    Femme Profil pro
    Ingénieur télécom
    Inscrit en
    Avril 2011
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur télécom
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Avril 2011
    Messages : 6
    Par défaut Comparer deux fihciers xml en java
    Bonjour, je suis nouvelle en java et dans le cadre de mon stage il m'est demandé de comparer deux fichiers xml et d'afficher les deux fichiers avec les lignes différentes en couleurs.

    Je vous remercie de m'apporter quelques idées et librairies ou même des codes similaires

    Merci d'avance

  13. #13
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 582
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    A priori c'est la même chose que pour des fichiers textes quelconques.

    Un petit algorithme de diff. On peut trouver une bibli Java ici, par exemple : http://code.google.com/p/java-diff-utils/
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 10/09/2006, 16h09
  2. [DOM] Enregistrer un Document dom dans un fichier xml
    Par java_girl dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 09/09/2006, 20h38
  3. [JDOM] Comparer deux fichiers XML en Java
    Par calimero2611 dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 30/06/2006, 11h19
  4. [python][DOM] alléger un fichier XML
    Par Mireyu_c dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 02/06/2006, 10h52
  5. [DOM] Génération dynamique fichier xml
    Par Fabouney dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 03/10/2005, 09h45

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo