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 :

Parsage : comment boucler sur les enfants d'un noeud ? [JDOM]


Sujet :

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

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut Parsage : comment boucler sur les enfants d'un noeud ?
    Bonjour,

    j'aurais besoin de votre aide pour un parsage en xml. Je dispose d'un xml bidon pour faire simple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <MonXML>
         <Collection>
              <Livre>
                   <Titre>Livre</Titre>
                        <Page>
                             <Paragraphe>Paragraphe 1</Paragraphe>
                             <Paragraphe>Paragraphe 2</Paragraphe>
                        </Page>
                   <Auteur>Ixxe EMELE</Auteur>
              </Livre>
         </Collection>
    </MonXML>
    Mon but est de parser ce xml en JAVA à l'aide de JDOM. Pour le moment j'arrive à récupérer les valeurs des premiers élements tel que Titre ou Auteur, mais je n'arrive pas à boucler sur l'élement Page et récupérer les valeurs des paragraphe...

    Un exemple du code que j'utilise:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Map<String, String> parametres = new HashMap<String, String>();
    NodeList childNodes = parentElement.getChildNodes();
     
    for (int j = 0; j < childNodes.getLength(); j++) 
    {		Node item = childNodes.item(j);
    	parametres.put(item.getNodeName(), item.getFirstChild().getNodeValue());
    }
    Dans ce cas la, si je boucle sur mon xml actuel, je récupère le Titre et l'Auteur dans ma HashMap, ce qui donnera par exemple key: Titre, value: Livre (seon le principe de la HashMap).

    Comment faire pour que, quand j'arrive sur l'élement Page, je puisse boucler sur les enfants de clui-ci ?

    Merci d'avance

  2. #2
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    On peut modifier ton code pour que tu boucle sur les fils Page, mais si tu y arrives, que ferais-tu derrière?

    Si tu range les valeurs de ses fils de la même manière, tu n'auras qu'une seule des deux valeurs pour Paragraphe, puisque la 2e écrasera la première.

    Il faut commencer par revoir le besoin exact je pense.

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Mon besoin étant simplement de récupérer toutes valeurs que ce soit, et ce, quelque soit le nombre d'enfant qu'aura chaque élément.

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Avec ma méthode pour le moment, je stock tout dans uen HashMap. Il me récupère Titre et sa valeur, quand il passe à Page, il me récupère comme valeur \n\t\t\t\t. En plus de ca, il me récupère Auteur et sa valeur en l'écrasant sur Titre la ca va plus !

  5. #5
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Peux-tu détailler le résultat que tu souhaites obtenir à la fin?

    Si tu utilises une Map<String, String> avec comme clé le nom de la balise, tu vas perdre des informations, car tu n'a pas unicité des balises.

    Il faut réfléchir à une autre structure de données ou à un système de clé plus complet.
    Si tu n'as pas trop d'idées, tu peux nous dire ce que tu veux faire des résultats.

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Je veux simplement récupérer et stocker les résultats, avec la possibilité d'utiliser ces données plus tard.

  7. #7
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    Oui, mais comment comptes-tu différencier tes deux balises 'Paragraphe'?

    Explique-nous comment tu vas faire pour récupérer la valeur "Paragraphe 1" dans ta map et pour récupérer la valeur "Paragraphe 2".

  8. #8
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    Je pense stocker ces données dans une HashMap, celle-ci qui serait stocké dans une autre HashMap au final :s, je n'sais pas si cette démarche sera des plus correcte ...

    Je pense stocker ces données dans une HashMap, celle-ci qui serait stocké dans une autre HashMap au final :s, je n'sais pas si cette démarche sera des plus correcte ...

    Le processus se déroulerait ainsi:
    je boucle sur mon élement Livre, (j'utilise l'opérateur instanceof qui me permet d'éviter le stockage des valeurs #text) je lis le Titre et le récupère dnas la HashMap hmLivre, ensuite j'arrive l'élement Page, il me trouve comme nom de noeud Page et comme valeur \n\t\t\t\t. A ce moment j'aimerais pouvoir vérifier si dans Page, il ne contient pas des enfants et donc voir si Paragraphe existe bel et bien. J'ai essayé element.hasChildNodes mais sans succès.

    Si je peux parcourir l'arbre de Page et lire les différentes enfants de celui-ci, je stockerais alors chaque valeur dans une HashMap.

    Edit: je viens de me rendre compte par moi même du problème d'unicité, en effet quand je lis le deuxième "Paragraphe", il m'écrase la valeur du premier.

  9. #9
    Membre éprouvé
    Inscrit en
    Mars 2006
    Messages
    848
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Mars 2006
    Messages : 848
    Points : 1 078
    Points
    1 078
    Par défaut
    A mon avis, le mieux serait de créer une classe Livre représentant les données de ton XML.

    Elle proposerait (par exemple):
    une méthode getTitre() qui renverrai une String,
    une méthode get Pagaraphes() qui renverrai une List<String>,
    une méthode getAuteur() qui renverrai une String ...

    Comme ça, tu n'as plus qu'à manipuler l'objet Livre.

    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    public class Livre {
     
        // Elément Jdom
        private Element mXmlElement;
     
     
        /**
         * Constructeur
         * @param pElement élément XML 
         */
        public AbstractXmlHandler(Element pElement) {
            super();
            mXmlElement = pElement;
        }
     
        /**
         * @return le titre
         */
        public String getTitre()
        {
            return mXmlElement.getChildText("Titre");
        }
     
        /**
         * @return les paragraphes
         */
        public List<String> getParagraphes() {
            List<String> lParagraphes = new ArrayList<String>();
            for (Object lParag : mXmlElement.getChild("Page").getChildren("Paragraphe")) {
                lParagraphes.add(((Element)lParag).getNodeValue());
            }
            return lParagraphes;
        }
     
        /**
         * @return l'auteur
         */
        public String getAuteur() {
            return mXmlElement.getChildText("Auteur");
        }
     
    }
    J'ai tapé ce bout de code de mémoire et sans éditeur, il peut donc y avoir des coquilles, mais c'est l'esprit qui compte.

    Il ne reste plus qu'à donner au constructeur l'élément 'Livre' et il se débrouille tout seul.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 42
    Points : 26
    Points
    26
    Par défaut
    J'ai pu trouver une "solution" en parallèle à la tienne . En fait, j'ai mis une simple condition, quand NodeName="Page", alors je lis chaque fils de celui-ci (instanceof pour éviter les #text) et je les stocke dans une List. Cette liste est ensuite stocké dans le HashMap Livre.

    Pour le moment ca marche mais je pense avoir quelques soucis plus tard ^^. Par contre un grand merci à toi Deaf, j'ai étudier de plus près ta solution et je pense retravailler dessus .

    Je donne un petit apeçu pour ceux que cela intéresse :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    List<String> ParagrapheName = new ArrayList<String>();
     
    if (item.getNodeName() == "Page") {
    	for (int l = 0; l < item.getChildNodes().getLength(); l++) {
    	Node item2 = item.getChildNodes().item(l);
    	if (item2 instanceof Element) {
    		ParagrapheName.add(item2.getFirstChild()
    		.getNodeValue());
    	}
    }

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

Discussions similaires

  1. [Toutes versions] Recherche comment boucler sur les boites emails ?
    Par Gerard_tlse dans le forum VBA Outlook
    Réponses: 2
    Dernier message: 23/04/2015, 21h27
  2. [XL-2003] Comment boucler sur les tableaux page web
    Par Maxgad dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 30/01/2013, 12h37
  3. [XSLT 1.0] Comment boucler sur les infos d'un élément précis
    Par Janko dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 18/06/2012, 14h45
  4. [VB.NET] Boucler sur les checkbox de mon formulaire
    Par malhivertman1 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 24/08/2006, 11h51
  5. [VB6] Comment boucler sur des controls d'un form ?
    Par lankviller dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 27/01/2003, 17h29

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