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 :

Problème pour lire les noeuds avec JDOM [JDOM]


Sujet :

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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut Problème pour lire les noeuds avec JDOM
    L'exemple donné au lien suivant http://cynober.developpez.com/tutoriel/java/xml/jdom/ marche effectivement tres bien pour le fichier XML presenté mais pose des problemes avec un fichier n'ayant pas la meme structure. J'ai bessoin de lire mon fichier xml suivant (par 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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <listeqcm>
      <qcm nom="Connaissances generales">
        <question requete="Quel est la hauteur de  ?">
          <reponse correct="oui">100m</reponse>
          <reponse correct="non">5000m</reponse>
          <reponse correct="non">2m</reponse>
        </question>
        <question requete="Fait-il beau ?">
          <reponse correct="oui">oui</reponse>
          <reponse correct="non">non</reponse>
        </question>
        <question requete="Y pleux ?">
          <reponse correct="non">oui</reponse>
          <reponse correct="oui">non</reponse>
        </question>
      </qcm>
    </listeqcm>
    Pour l'ouverture du fichier xml pas de probleme, c'est pour la lecture qu'il n'y a plus concordance avec l'exemple JDOM.
    Voici l'equivalent de l'exemple mais adapté a mon porg :

    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
    	// pour la lecture
    	void lecture()
    	{
    	   //On crée une List contenant tous les noeuds "qcm" de l'Element racine
    	   List listQcm = racine.getChildren("qcm");
     
    	   Iterator i = listQcm.iterator();
    	   while(i.hasNext())
    	   {
    		   //On recrée l'Element courant à chaque tour de boucle afin de
    		   //pouvoir utiliser les méthodes propres aux Element comme :
    		   //selectionner un noeud fils, modifier du texte, etc...	   
    		   Element courant = (Element)i.next();		
    		   System.out.println(courant.getChild("question").getAttributes());
    	   }	    	  	      	    	      	   	   
    	}
    La coquille vient du fait de l'iterator qui ne vaut que 1 puisque je n'est qu'un Noeud <qcm> et donc ensuite il prend a la ligne suivant (<question> et me lit bien la premiere question mais seulement la 1ere.
    Ce que je voudrais c'est lire mes 3 questions. L'exemple fourni ne permet pas de la faire et j'ai beau avoir essayer plusieurs choses (des boucles, des methodes pour naviguer avec les iterators ect ..) rien a faire, je ne possede pas assez les connaissances pour le faire.
    Quelqu'un peut-il m'aider svp ?

  2. #2
    Membre habitué Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Points : 156
    Points
    156
    Par défaut
    Bonjour,
    Il faut lire les questions en utilisant un iterateur, quelque chose du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Iterator questionIt = courant.getChildren("question").iterator();
    ...
    Voila une ébauche pour ta fonction (pas testé) :
    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
     
       // pour la lecture
       void lecture()
       {
          Iterator qcmIt = racine.getChildren("qcm").iterator();
          while(qcmIt.hasNext())
          {
             Element qcm = (Element)qcmIt.next();      
             Iterator questionIt = qcm.getChildren("question").iterator();
             while(questionIt.hasNext())
             {
                System.out.println(((Element) questionIt).next()).getAttributes());
             }
          }                                                 
       }

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Ok g tester ce que tu m'a proposer Xavinou (petite erreur dans le println avec le next() qui ne s'applique pas un type Element mais a un iterator) En regardant de plus pres ton prog il est equivalent au mieux a ceci pres qu'il créer un 2eme iterator, (et qu'il y a moins de ligne) Mais je te remercie tout de meme j'ai pu essayer la piste que tu ma lancer (créer 2 iterator) mais nan pas mieux.
    Et c la le probleme c'est que je ne sais pas passer tous les noeuds questions apres avoir fait un iterator qui lit le premier noeud.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Mon probleme s'eclairci mais je ne peux toujours pas le resoudre fautes de connaissances et d'exemples sur le net. Je fait donc appel a vous pour m'aider vous pouvez me poser toutes les questions necessaires.

    Ce qu'il faut resoudre c'est le moyen de lire les 3 noueds questions dans le fichier xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <question requete="Quel est la hauteur de  ?">
    <question requete="Fait-il beau ?">
    <question requete="Y pleux ?">
    Avec le code que j'ai presenter en 1er post j'obtiens la premiere ligne.
    Je vais tacher d'etre le plus clair possible, les mots utiliser ne seront peut etre pas tres conformes au appellation des programmeurs.

    Avec cette ligne je demarre a partir de qcm dans mon fichier xml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List listQcm = racine.getChildren("qcm");
    Cette ligne va me compter le nombre d'element qcm :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Iterator i = listQcm.iterator();
    J'en est 1 (voir 1er post pour le fichier xml)

    Je rentre dans chaque bloc qcm :
    1 seule fois donc

    Je passe donc dans qcm pour lire l'element suivant (dans le bloc qcm)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Element courant = (Element)i.next();
    Va bien sur la premiere question

    Et j'affiche donc la valeur de son attribut (ou autre peut importe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(courant.getChild("question").getAttributes());
    J'obtiens donc ma premiere question a l'affiche

    Ensuite avec la boucle TantQue le test devient faut et je quitte ma boucle PB ! pas bon y me faut les 3 questions

    Si je créer la list de la fason suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    List listQuestion = question.getChildren("question");
    On peut penser que l'iterator va créer la list avec tout les noeuds (sa oui) et apres pouvoir les lires dans le while mais non car les getAttributes() ou getText() ne s'applique pas au iterator.
    Ceci marchera avec un println(getChild("reponse")......mais la encore je lirais seulement ma premiere reponse de chaque questions.

    Merci d'avance.

  5. #5
    Membre habitué Avatar de Xavinou
    Inscrit en
    Mai 2005
    Messages
    135
    Détails du profil
    Informations forums :
    Inscription : Mai 2005
    Messages : 135
    Points : 156
    Points
    156
    Par défaut
    effectivement il y avait une parenthèse de trop dans mon bout de code...

    mais le principe reste bon !!!

    à chaque fois que tu as plusieurs sous-éléments, il te faut un iterateur pour les parcourir... si tu t'entetes à faire des "getChild("sous-element")" tu visiteras forcement uniquement le premier sous-élément.

    Il faut que tu vois ton document xml comme un arbre, pour chaque noeud il te faut un itérateur (puisque tu as choisi cette implémentation) si tu veux parcourir tous ses fils...

    donc en résumé :
    - un itérateur qui te permettra de parcourir tous les qcm
    - un itérateur qui te permettra de parcourir toutes les questions
    - un itérateur qui te permettra de parcourir toutes les réponses
    ils doivent être imbriqués les uns dans les autres, pour coller à la structure de ton document

    bon courage ;-)

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Octobre 2005
    Messages : 18
    Points : 16
    Points
    16
    Par défaut
    Ok merci sa marche, tout etait clair. C'est juste que je disais, que le next() ne s'applique pas aux iterator (mais avec le transtypage nikel)
    Merci bien.

  7. #7
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2014
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2014
    Messages : 2
    Points : 3
    Points
    3
    Par défaut
    La parenthèse de trop c'est ou?

  8. #8
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 551
    Points : 21 607
    Points
    21 607
    Par défaut
    Sur la ligne où ton compilateur t'indique qu'il y a une parenthèse de trop.

    De toute façon, depuis JDOM 2, on fait plus comme ça.
    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. Problème pour lire du texte avec Excel
    Par Blobette dans le forum C#
    Réponses: 3
    Dernier message: 28/02/2009, 14h47
  2. Problème pour lire les donnée d'une table externe
    Par mardoch dans le forum SQL*Loader
    Réponses: 6
    Dernier message: 17/07/2008, 16h41
  3. Problème pour lire les flux rss en flex
    Par gannher dans le forum Flex
    Réponses: 6
    Dernier message: 18/07/2007, 16h24
  4. Réponses: 2
    Dernier message: 07/11/2006, 22h42
  5. Réponses: 1
    Dernier message: 17/05/2004, 11h29

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