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

Format d'échange (XML, JSON...) Java Discussion :

[DOM4J] Parser un xml [XPATH]


Sujet :

Format d'échange (XML, JSON...) Java

  1. #1
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut [DOM4J] Parser un xml
    Salut,

    J'ai du rarement parser un document XML, donc ne rigolais pas si la question parait très simple

    Je voudrais juste parser un document XML est récupéré des nodes sans connaitre leurs noms.

    Exemple :

    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
    28
    29
    30
    31
    <preferences EXTERNAL_XML_VERSION="1.0">
      <root type="system">
        <map/>
          <node name="connections">
    	   <map/>
                <node name="uat">
    				<map>
    		            <entry key="user" value="member" />
    		            <entry key="pass" value="member" />
    		            <entry key="host" value="localhost" />
    		            <entry key="port" value="2097" />
    		        </map>
                </node>
    			<node name="uat2">
    				<map>
    		            <entry key="user" value="membe2" />
    		            <entry key="pass" value="member2" />
    		            <entry key="host" value="localhost" />
    		            <entry key="port" value="2088" />
    		        </map>
                </node>
          </node>
    	  <node name="mapping">
    		<map>
                <entry key="xxx" value="yyy" />
                <entry key="xxx2" value="yyy2" />
    		</map>         
    	  </node>
     
      </root>
    </preferences>
    Je voudrais pouvoir récupérer le noeud uat, mapping ... c'est tout.

    J'ai fait un petit programme qui se base sur Sax mais j'ai pas réussis à le faire marcher.

    Pouvez vous me donner un lien sur une doc qui me montre comment faire ce que je voudrais. Ou bien un exemple de votre part

    Merci beaucoup

  2. #2
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    dom4j et une expression Xpath du style "//uat" :

    http://www.dom4j.org/

    Pour les exemples :

    http://www.dom4j.org/dom4j-1.6.1/guide.html

    et notamment :
    List list = document.selectNodes( "//foo/bar" );

  3. #3
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Moi je connais pas "uat" il faut que je l'a lit, les seuls que je connais sont les keys user, pass, host.

    dom4j pourrait it faire l'affaire ?

  4. #4
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Oui pas de problème grace à Xpath.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List list = document.selectNodes( "//entry" );
    Avec cela tu va récupérer une liste de toute les nodes entry.

  5. #5
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Merci,

    Au fait j'essaye d'utiliser cette méthode, mais j'ai un petit soucis. Je ne sais pas comment récupérer le nom de mon noeud

    voila ce que je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     SAXReader reader = new SAXReader();
     org.dom4j.Document document = reader.read(xmlFileName);
     List list = document.selectNodes("//node");
     for ( Iterator i = list.iterator(); i.hasNext(); ) 
     {
       org.dom4j.Element element = (org.dom4j.Element) i.next();
       System.out.println(element.getName());
     }
    Avec ça il m'affiche node, moi je voudrais afficher l'attribut name du noeud nod

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    exemple : <node name="uat"> uat dans ce cas

  6. #6
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element.attributeValue("key"); // par exemple

  7. #7
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Mais dans le cas de <node name="uat"> j'ai pas d'attribut key !

    Moi je voudrais récupérer "uat".

    Désolé mais je vois pas comment je dois faire

  8. #8
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    C'est comme un parcours d'arbre, tu itères sur
    Tous les exemples sont ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.dom4j.org/dom4j-1.6.1/guide.html

  9. #9
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Merci beaucoup, j'ai trouvé comment faire pour récupérer uat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element.attributeValue("name")
    Les autres avec l'attribut key, ca sera plus facile, car je connais les keys

    Merci encore

  10. #10
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Ah oui, j'avais une autre question, je sais pas si vous pouvez me répondre.

    Dans le cas où l'on utilise un fichier de préférences et ce que je peux récupérer des nœuds sont connaitre leur noms ?

    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InputStream is = new FileInputStream(file);
    Preferences.importPreferences(is);
    Preferences prefs = Preferences.systemRoot();
    Car avant j'utilisais ça et c'est très facile je trouve, mais je connaissais la valeur des keys. Mais récupérer un noeud sans connaitre sa valeur, ça j'ai pas pu.

  11. #11
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Je ne comprends pas la question.
    Détail moi exactement le problème et je pourrais probablement t'aider. Les expressions XPath sont très puissantes.

  12. #12
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    Au fait, avant j'avais un fichier de préférences que je chargé au début. La même structure de toute à l'heure :

    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
    28
    29
    30
    <preferences EXTERNAL_XML_VERSION="1.0">
      <root type="system">
        <map/>
          <node name="connections">
     
    			<map>
    		            <entry key="user" value="member" />
    		            <entry key="pass" value="member" />
    		            <entry key="host" value="localhost" />
    		            <entry key="port" value="2097" />
    		        </map>
                </node>
    			<node name="uat2">
    				<map>
    		            <entry key="user" value="membe2" />
    		            <entry key="pass" value="member2" />
    		            <entry key="host" value="localhost" />
    		            <entry key="port" value="2088" />
    		        </map>
                </node>
          </node>
    	  <node name="mapping">
    		<map>
                <entry key="xxx" value="yyy" />
                <entry key="xxx2" value="yyy2" />
    		</map>         
    	  </node>
     
      </root>
    </preferences>
    Le fichier était statique donc je connaissais tous les noeuds de mon fichier. Ce que je faisais c'est charger le fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    InputStream is = new FileInputStream(file");
    Preferences.importPreferences(is);
    Preferences prefs = Preferences.systemRoot();
    Puis je récupérais le noeud que je voulais grâce à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Preferences sessionPrefs = prefs.node("connections");
    Puis les sous noeuds grâce à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sessionPrefs.get(CONFIG.SESSION.KEY_USER, CONFIG.SESSION.DEFAULT_USER);
    Or quand on a décidé que notre fichier de préférence soit c'est fois dynamique. Je pouvais plus connaitre le noeud "connections" par exemple. Donc je pouvais plus faire la même chose ...


    C'est pour cela je me demandais si avec la méthode que j'utilisais avant, je pourrais faire la même chose avec la méthode que tu viens de me montrer. Ceci dit ta méthode marche très bien. C'est juste pour savoir si c'est possible ou pas

    J'espere que j'etais clair

    Merci

  13. #13
    Membre expérimenté Avatar de aperrin
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    221
    Détails du profil
    Informations personnelles :
    Âge : 53
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 221
    Par défaut
    Xpath te permet de rechercher un nom de nœud n'importe ou dans le fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List list = document.selectNodes("//node");
    recherche toutes les éléments dont le nom est node quelque soit l'emplacement dans le document xml.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List list = document.selectNodes("root/node/map");
    te fourni la liste des éléments de type map sous root/node

    ou plus drôle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List list = document.selectNodes("root/node/map/entry[@key='user']");
    te fourni la liste des elements entry ayant un attribut key qui à pour valeur user (je ne garantie pas à 100% la syntaxe).

    Bref XPath est très puissant !

  14. #14
    Membre éclairé
    Inscrit en
    Juillet 2007
    Messages
    456
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 456
    Par défaut
    je suis tout à fait daccord. De toute facon ,j'ai implémenté ça et je suis content du resultat

    merci

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

Discussions similaires

  1. [C#] Parser du XML
    Par karl3i dans le forum Windows Forms
    Réponses: 5
    Dernier message: 27/02/2009, 09h46
  2. [DOM] Parser un XML
    Par Zapan dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 02/12/2005, 11h41
  3. [DOM XML] Comment parser du XML avec une version 4.3 ?
    Par ouioui2000 dans le forum Bibliothèques et frameworks
    Réponses: 7
    Dernier message: 18/10/2005, 15h52
  4. [FLASH MX2004] Parser un XML en action script
    Par jejeman dans le forum Flash
    Réponses: 6
    Dernier message: 20/09/2005, 17h25
  5. [XSL] Parser fichier xml : erreurs + incompréhensions
    Par totobouchon dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 19/07/2005, 15h47

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