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 :

Récupération valeurs xml


Sujet :

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

  1. #1
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut Récupération valeurs xml
    Voilà mon fichier xml :

    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
    <?xml version="1.0" encoding="utf-8" ?>
    <mnop>
      <partie id="2" tour="1" main="1">
        <tirage>12</tirage>
        <joueurs>
          <joueur> <!-- joueur 1 : humain -->
            <argent>1500</argent>
            ...
          </joueur>
          <joueur type="0">  <!-- joueur 2 cpu -->
            <argent>800</argent>
            <...
          </joueur>
          <joueur type="4">  <!-- joueur 3 cpu -->
            <argent>8250</argent>
            ...
          </joueur>
          <joueur type="1">  <!-- joueur 4 cpu -->
            <argent>70</argent>
            ...
          </joueur>
        </joueurs>
    Je veux retourner la liste d'argent pour chaque joueur.
    Voici ma fonction :

    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
    // Affiche l'argent de chaque joueur
    	public List<Integer> afficherArgent()
    	{   
    	   List list = racine.getChildren("partie");
     
    	   //On crée un Iterator sur notre liste
    	   Iterator i = list.iterator();
    	   while(i.hasNext())
    	   { 
    	      Element courant = (Element)i.next();
     
    	      List list2 = courant.getChildren("joueurs");
    	      Iterator i2 = list2.iterator();
    	      while(i2.hasNext())
    	      {
    	    	  Element courant2 = (Element)i2.next();
     
    	    	  List list3 = courant2.getChildren("joueur");
    	    	  Iterator i3 = list3.iterator();
    	    	  while(i3.hasNext())
    		      {
    	    		  Element courant3 = (Element)i3.next();
    	    		  //System.out.println(courant3.getChild("argent").getText());
    	    		  valeursArgent.add(Integer.parseInt(courant3.getChild("argent").getText()));
    		      }
    	      }
    	   }
     
    	   return valeursArgent;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    public static void main(String[] args) {
     
    		List<Integer> tableauArgent = new ArrayList<Integer>();
    		DonneesXML donnees = new DonneesXML();
    		tableauArgent = donnees.afficherArgent();
     
    		System.out.println(tableauArgent);
     
    	}
    La console me retourne [1500, 800, 8250, 70, 1500, 800, 8250, 70]
    alors que çà devrait me retourner [1500, 800, 8250, 70]

    Je ne comprends pas pourquoi. Merci de votre aide.

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Bonjour,

    Ta liste valeursArgent devrait être instanciée dans ta méthode afficherArgent(...), car si tu l'appelle plusieurs fois sans le vider, ça va cumuler. Il est probable que ce soit ton problème, mais sans voir le code complet impossible à dire.

    Sinon, poste ton XML complet et affiche (ou débug) les tailles des listes ramenée par par les getChildren(...) ça te permettra de trouver ton erreur.

  3. #3
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    Merci de votre réponse!
    En effet, je l'instanciait dans le constructeur ce qui est une erreur...
    Merci beaucoup.

  4. #4
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Pense au tag si c'est bon.

  5. #5
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    Une dernière question (avant de mettre un résolu )

    Le noeud joueur en réalité est constitué de la façon suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <joueur> <!-- joueur 1 : humain -->
            <argent>1500</argent>
            <position indice="1"/>
            <proprietes>
              <propriete indice="2">
                <maison />
                <maison />
              </propriete>
              <propriete indice="4">
              </propriete>
            </proprietes>
          </joueur>
    J'aimerai compter le nombre de maisons pour un joueur (dans ce cas 2).
    Une petite piste? Je ne trouve rien sur cela mis à part en php.
    Merci d'avance.

  6. #6
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Quelle lib xml utilises tu ?

    A quoi correspondent tes balises propriete et l'attribut indice ?

    Il serait bien plus simple d'avoir une structure xml du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <joueur>
        <maisons>
            <maison ..../>
            <maison ..../>
            <maison ..../>
        </maisons>
    </joueur>

  7. #7
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    J'utilise JDom.
    Je suis bien d'accord avec toi pour la structure, malheureusement celle ci nous est imposée...
    Ce que je veux c'est compter le nombre de maisons, donc compter le nombre de lignes où apparaissent <maison />

  8. #8
    Membre émérite Avatar de Gardyen
    Homme Profil pro
    Bio informaticien
    Inscrit en
    Août 2005
    Messages
    637
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Bio informaticien

    Informations forums :
    Inscription : Août 2005
    Messages : 637
    Par défaut
    j'utilise l'api xml de base org.w3c.xxx
    elle contient une méthode getElementsByTagName(String name) qui permet de récupérer tous les enfants avec le tag name

    n'y a-t-il pas le même genre de fonction dans JDOM ? j'ai regardé vite fait et j'ai vu les méthodes getChildren(Filter...), cela ne correspond-il pas à ce que tu cherches ?

  9. #9
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Un algo dans ce style ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int compteurMaison = 0;
     
    Pour chaque propriete
         Pour chaque fils de propriete
               Si fils de type maison
                       compteurMaison++
               Finsi
         Finpour
    Finpour

  10. #10
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    J'ai suivi ton algorithme (ce que j'avais fait au départ).
    Voici le 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    public List<Integer> récupérerPositionsJoueurs()
    	{
    		int compteurMaison = 0;
    		List list = racine.getChildren("partie");
    		valeursPositions = new ArrayList<Integer>();
     
    		//On crée un Iterator sur notre liste
    		Iterator i = list.iterator();
    		while(i.hasNext())
    		{ 
    			Element courant = (Element)i.next();
     
    		    List list2 = courant.getChildren("joueurs");
    		    Iterator i2 = list2.iterator();
    		    while(i2.hasNext())
    		    {
    		    	Element courant2 = (Element)i2.next();
     
    		    	List list3 = courant2.getChildren("joueur");
    		    	Iterator i3 = list3.iterator();
    		    	while(i3.hasNext())
    			    {
    		    		Element courant3 = (Element)i3.next();
     
    			    	List list4 = courant3.getChildren("proprietes");
    			    	Iterator i4 = list4.iterator();
    			    	while(i4.hasNext())
    			    	{
    			    		Element courant4 = (Element)i4.next();
     
    				    	List list5 = courant4.getChildren("propriete");
    				    	Iterator i5 = list5.iterator();
    				    	while(i5.hasNext())
    				    	{
    				    		Element courant5 = (Element)i5.next();
    				    		if(courant5.equals("maison /"))
    				    		{
    				    			compteurMaison++;
    				    		}
    				    	}
     
    			    	}
    			    }
    		    }
    		 }
    		 valeursPositions.add(compteurMaison);
    		 return valeursPositions;
    	}

    Le compilateur me renvoie [0] alors que je compte les noeuds fils contenus dans propriete.
    Je voudrai récupérer le nombre de maisons pour chaque joueur mais là je vois vraiment pas comment procéder
    Et je voudrai récupérer le nombre de maisons pour chaque joueur,

  11. #11
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2004
    Messages
    1 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Avril 2004
    Messages : 1 184
    Par défaut
    Essaye de remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(courant5.equals("maison /"))
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(courant5.getName().equals("maison"))
    Au passage évite de nommer tes variables courant 1 2 3...
    Tu pourrais te mélanger.

    courantJoueur, courantPropriete semble plus approprié.

  12. #12
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Personnellement je m'embêterais pas, je ferais deux XPath :
    - un pour sélectionner tous les <joueur> et itérer dessus
    - un pour compter les <maison> contenues dans le <joueur> en cours.

    Si on aime pas les XPath, il y a quand même getDescendants(), avec un Filter sur nom d'élément, qui simplifie beaucoup les choses. Surtout en JDOM 2.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  13. #13
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    J'ai essayé et le compilateur me retourne toujours 0.
    Je cherche toujours une fonction qui me permettrait de compter le nombre de noeuds de tel élément. J'ai trouvé quelques idées mais rien ne concrétise.

  14. #14
    Membre très actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2011
    Messages : 145
    Par défaut
    J'ai persisté et je suis presque bon.

    J'arrive à récupérer le nombre de maisons pour tous les joueurs. Mais ce que je voudrai, c'est récupérer le nombre de maisons pour le joueur 1, pour le joueur 2... avec une fonction différente à chaque fois.

    Voici mon 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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    public Integer récupérerNbMaisonsJoueur1()
    	{
    		Integer compteurMaison = 0;
    		List list = racine.getChildren("partie");
    		valeursPositions = new ArrayList<Integer>();
     
    		//On crée un Iterator sur notre liste
    		Iterator i = list.iterator();
    		while(i.hasNext())
    		{ 
    			Element courantPartie = (Element)i.next();
     
    		    List list2 = courantPartie.getChildren("joueurs");
    		    Iterator i2 = list2.iterator();
    		    while(i2.hasNext())
    		    {
    		    	Element courantJoueurs = (Element)i2.next();
     
    		    	List list3 = courantJoueurs.getChildren("joueur");
    		    	Iterator i3 = list3.iterator();
    		    	while(i3.hasNext())
    			    {
    		    		Element courantJoueur = (Element)i3.next();
     
    			    	List list4 = courantJoueur.getChildren("proprietes");
    			    	Iterator i4 = list4.iterator();
    			    	while(i4.hasNext())
    			    	{
    			    		Element courantProprietes = (Element)i4.next();
     
    				    	List list5 = courantProprietes.getChildren("propriete");
    				    	Iterator i5 = list5.iterator();
    				    	while(i5.hasNext())
    				    	{
    				    		Element courantPropriete = (Element)i5.next();
    				    		System.out.println(courantPropriete.getName());
     
    				    		//System.out.println(courantPropriete.getChild());
     
    				    		List list6 = courantPropriete.getChildren();
    				    		Iterator i6 = list6.iterator();
    					    	while(i6.hasNext())
    					    	{
    					    		Element courantMaison = (Element)i6.next();
    					    		System.out.println(courantMaison.getName());
    					    		if(courantMaison.getName().equals("maison"))
    					    		{
    					    			compteurMaison++;
    					    		}
    					    	}
    				    	}	
    			    	}
    			    }
    		    }
    		 }
    		 return compteurMaison;
    	}
    Et voici le xml :

    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
    <joueurs>
          <joueur> <!-- joueur 1 : humain -->
            <argent>1500</argent>
            <position indice="1"/>
            <proprietes>
              <propriete indice="2">
                <maison />
                <maison />
              </propriete>
              <propriete indice="4">
              </propriete>
            </proprietes>
          </joueur>
          <joueur type="0">  <!-- joueur 2 cpu -->
            <argent>800</argent>
            <position indice="10"/>
            <proprietes>
            </proprietes>
          </joueur>
          <joueur type="4">  <!-- joueur 3 cpu -->
            <argent>8250</argent>
            <position indice="21"/>
            <proprietes>
              <propriete indice="40"> <maison /> </propriete>
            </proprietes>
          </joueur>
          <joueur type="1">  <!-- joueur 4 cpu -->
            <argent>70</argent>
            <position indice="31"/>
            <proprietes>
            </proprietes>
          </joueur>
        </joueurs>
    Je voudrai récupérer pour chaque joueur le nombre de maisons. Dans ce cas là, joueur 1 a 2 maisons, joueur 2 a 0 maisons, joueur 3 a 1 maison...

    Le compilateur me retourne 3 car il y a 3 maisons au total, mais je voudrai qu'il me retourne le nombre de maisons pour le joueur 1 soit 2 maisons.

  15. #15
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 586
    Par défaut
    Non mais je blaguais pas, en fait.

    Ce serait vraiment beaucoup plus simples avec des XPath ou, à défaut, en utilisant getDescendants(Filter).
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    265
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 265
    Par défaut
    Je n'ai pas très bien compris mais peut être que cela pourra t'aider un peu.

    Par contre, je ne sais pas comment récupérer le nombre d'Iterator, mis à part au travers d'un boucle.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    	static void recupererNbMaison(Document xml) {
    		Element racine = xml.getRootElement();
    		List<Element> joueur =  racine.getChildren("joueur");
    		for (Element i: joueur){
    			System.out.print("Joueur type => " + i.getAttributeValue("type")+"\t");
    			IteratorIterable<Element> propri =  i.getDescendants(new ElementFilter("propriete"));
    			int nombre = 0;
    			while(propri.hasNext()){
    				  propri.next();	
    				  nombre++;
    			}
    			System.out.println("Maison => " + nombre);			
    		}
    	}

Discussions similaires

  1. [WM17]Récupération valeur balise XML
    Par Nouche dans le forum Windev Mobile
    Réponses: 6
    Dernier message: 07/03/2013, 09h21
  2. DOM récupération valeur d'un xml
    Par zerros dans le forum Langage
    Réponses: 8
    Dernier message: 20/09/2012, 14h57
  3. récupération valeur dans un fichier XML
    Par lola79 dans le forum Langage
    Réponses: 14
    Dernier message: 20/04/2012, 13h20
  4. Réponses: 1
    Dernier message: 02/04/2007, 13h37
  5. Récupération valeur d'une propriété type TStrings
    Par Stéphane Vaillant dans le forum Langage
    Réponses: 2
    Dernier message: 01/03/2003, 12h47

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