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 de récupération d'une valeur dans un attribut d'une balise


Sujet :

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

  1. #1
    Membre averti
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut Problème de récupération d'une valeur dans un attribut d'une balise
    Bonjour à tous,

    Par avance merci de m'éclairer sur mon problème.
    J'ai le fichier xml suivant :
    Code XML : 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
     
    <maisons>
      <maison id="1">
        <RDC>
          <cuisine surface-m2="12">Evier Inox. Mobilier encastré</cuisine>
          <WC>Lavabo.</WC>
          <séjour  surface-m2="38">Cheminée en pierre. Baie vitrée</séjour>
          <bureau surface-m2="14">Bibliothèque</bureau>
          <garage/>
        </RDC>
        <étage>
          <terrasse/>
          <chambre surface-m2="28" fenetre="3">
            <alcove surface-m2="8"/>
          </chambre>
          <chambre surface-m2="18"/>
          <salledeBain surface-m2="15">
            Douche, baignoire, lavabo
          </salledeBain>
        </étage>
      </maison>
      <maison id="2">
        <RDC>
          <cuisine surface-m2="12">en ruine</cuisine>
          <garage/>
        </RDC>
        <étage>
          <mirador surface-m2="1">
            Vue sur la mer
          </mirador>
          <salledeBain surface-m2="15">Douche</salledeBain>
        </étage>
      </maison>
    </maisons>
    Et je dois utiliser un parseur sax afin d'avoir en sortie sur mon pc la chose suivante :

    Maison 1:
    superficie totale : 125 m2
    Maison 2:
    superficie totale : 28 m2

    Ainsi j'ai crée une classe java étendant DefaultHandler et dans la méthode startElement j'ai ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public void startElement(String nameSpaceURI, String localName, String rawName,                              Attributes attributs) throws SAXException {
    		if(localName.equalsIgnoreCase("maison")){
    			System.out.println("Maison " + attributs.getValue(0) + " :");
     
    		}
                   float surface = 0;
    		for (int index = 0; index < attributs.getLength(); index++) { 
    			if (attributs.getLocalName(index).equalsIgnoreCase("surface-m2")){		
    				surface += Float.parseFloat(attributs.getValue(index));
    			}
    			System.out.println("superficie totale " + surface);
    		}
    	}
    ça ne va absolument pas. Je n'arrive pas à additionner la surface de mes pièces.
    Surtout que dans la première balise maison. j'ai une alcôve dans la chambre qui fait donc partie des 28m2. donc je peux pas faire une boucle sur "surface-m2" mais du coup je sais pas du tout comment m'en sortir...

    Si quelqu'un pouvait au moins me donner une piste de réflexion ça serait super sympa
    Merci à vous !

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Ce serait plus facile avec JDOM qu'avec SAX.

    Mais bon...

    startElement() est appelée chaque fois que tu commences un élément.
    Donc chacun de tes éléments qui indiquent une surface (comme les éléments <cuisine>, <séjour>, <bureau>...), ils vont être appelés une fois, chacun, par startElement(). Tu ne peux donc pas faire la somme dans un seul appel. Il faut garder la somme entre les appels.

    Pour savoir quand tu as fini de calculer la somme, et donc qu'il est temps de l'afficher, c'est simple : c'est quand tu fermes l'élément <maison>.

    Donc, ça ressemble à ça :

    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
    private int surfaceTotaleEnCours = 0;
     
    public void startElement(String nameSpaceURI, String localName, String rawName,  Attributes attributs) throws SAXException {
      if(isMaison(localName)){
        afficherLIdDeLaMaison(attributs);
        surfaceTotaleEnCours = 0; // remettre la surface à zéro
      }
      if(cettePieceAUneSurface(localName, attributs)) {
        int surfaceDeCettePiece = lireLaSurface(attributs);
        surfaceTotaleEnCours += surfaceDeCettePiece;
      }
    }
     
    public void endElement(String nameSpaceURI, String localName, String rawName) {
      if(isMaison(localName)) {
        afficherLaSurfaceDeLaMaison();
      }
    }
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Membre averti
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    J'ai pas le choix, je dois le faire avec sax.

    J'ai suivi ce que tu m'as indiqué et mon code ressemble à ça maintenant :
    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
     
    private surfaceTotaleMaison = 0;
     
    public void startElement(String nameSpaceURI, String localName, String rawName, Attributes attributs) throws SAXException {
    		if(localName.equalsIgnoreCase("maison")){
    			System.out.println("Maison " + attributs.getValue(0) + " :");
    			surfaceTotaleMaison = 0;
    		}
    		for (int index = 0; index < attributs.getLength(); index++) { // on parcourt la liste des attributs
    			if (attributs.getLocalName(index).equalsIgnoreCase("surface-m2")){
    				if(localName.equalsIgnoreCase("alcove")){
    					return;
    				}
    				float surfacePiece = Float.parseFloat(attributs.getValue(0));
    				surfaceTotaleMaison += surfacePiece;
    			}
    		}
    	}
     
    	public void endElement(String nameSpaceURI, String localName, String rawName) throws SAXException {
    		if(localName.equalsIgnoreCase("maison")){
    			System.out.println("surface totale : " + surfaceTotaleMaison + " m2");
    		}
    	}
    Cela m'affiche :
    Maison 1 :
    surface totale : 125.0 m2
    Maison 2 :
    surface totale : 28.0 m2

    Pour la maison 1 j'ai mis une condition pour l'alcove car sa surface est comptée dans la chambre.
    Cependant je me pose une question sur mon code, il n'y a pas une solutions plus élégante qu'avec la recherche sur les noms des balises ?

    Et sinon si j'ajoute ceci dans mon fichier xml :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    <maison id="3">
        <RDC>
          <séjour fenetre="4" surface-m2="40"/>
        </RDC>
        <étage>
          <chambre surface-m2="17.5">Exposition plein sud</chambre>
        </étage>
      </maison>
    Avec mon code java ça me donne :
    Maison 3 :
    surface totale : 21.5 m2

    Pourquoi un tel résultat et pourquoi pas le bon nombre 57.5 ??
    Merci de votre aide !!

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Citation Envoyé par Antheadousa Voir le message
    Cependant je me pose une question sur mon code, il n'y a pas une solutions plus élégante qu'avec la recherche sur les noms des balises ?
    Si... Avec une approche DOM au lieu de SAX, tu pourrais sélectionner les données que tu veux par XPath, ce qui serait passablement plus simple.

    Citation Envoyé par Antheadousa Voir le message
    Pourquoi un tel résultat et pourquoi pas le bon nombre 57.5 ??
    Parce que le zéro dans attributs.getValue(0) n'a pas de sens.

    (Ah, et puis, mauvaise idée d'utiliser des float. Regarder plutôt du côté des double ou des BigDecimal. Mais le problème n'est pas là, je dis ça juste pour éviter les autres problèmes.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre averti
    Femme Profil pro
    Développeur Java
    Inscrit en
    Mai 2011
    Messages
    11
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Distribution

    Informations forums :
    Inscription : Mai 2011
    Messages : 11
    Par défaut
    Parce que le zéro dans attributs.getValue(0) n'a pas de sens.

    (Ah, et puis, mauvaise idée d'utiliser des float. Regarder plutôt du côté des double ou des BigDecimal. Mais le problème n'est pas là, je dis ça juste pour éviter les autres problèmes.)
    Oula effectivement j'avais pas fait gaffe pour attributs.getValue(0), j'ai remplacé par attributs.getValue(index), ça marche drôlement mieux

    J'ai suivi ton conseil et j'ai mis des double plutôt que des float, par contre en utilisant des float quels pouvaient être les autres problèmes ?

    Merci beaucoup en ton cas pour ton aide thelvin

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 576
    Par défaut
    Citation Envoyé par Antheadousa Voir le message
    J'ai suivi ton conseil et j'ai mis des double plutôt que des float, par contre en utilisant des float quels pouvaient être les autres problèmes ?
    Les floats sont très peu précis.

    Il suffit qu'un jour tu tombes sur un calcul de surface un peu surprenant avec plein de chiffres significatifs, et vlan ! Dans le résultat le dernier chiffre après la virgule est faux. Ça fait vraiment ballot à montrer aux gens.
    En théorie la même chose peut arriver avec des doubles, mais vraisemblablement pas avec des données réalistes des surfaces d'habitation. Moi, pour être sûr, je prendrais des BigDecimal à la place, mais c'est peut-être un peu trop de prudence.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

Discussions similaires

  1. [XL-2000] Remplir une valeur dans cellule à partir d'une valeur precise d'un fichier texte
    Par cactus666 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 26/01/2010, 10h31
  2. [VB2008E] Où stocker une valeur dans les items d'une combobox ?
    Par dsolheid dans le forum Windows Forms
    Réponses: 2
    Dernier message: 19/01/2008, 19h14
  3. Réponses: 1
    Dernier message: 14/11/2007, 11h53
  4. Récupérer une valeur dans un champ d'une autre table
    Par Kareg dans le forum Modélisation
    Réponses: 15
    Dernier message: 24/10/2007, 14h16
  5. Réponses: 10
    Dernier message: 15/05/2007, 14h24

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