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 :

Parseur SAX récupération valeur d'une balise comportant un attribut [SAX]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    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 Parseur SAX récupération valeur d'une balise comportant un attribut
    Bonsoir,

    j'ai un fichier KML dont la construction au niveau d'une balise est la suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <SimpleData name="DIMENSION">5</SimpleData>
    <SimpleData name="PAYSAGE">0</SimpleData>
    <SimpleData name="PARTICULAR">0</SimpleData>
    J'arrive à récupérer les différentes valeur des attributs, mais je souhaiterai récupérer la valeur de la balise correspondante à la valeur de l'attribut, et je ne sais pas comment m'y prendre.

    Le résultat escompté devrait être de la sorte :

    DIMENSION = 5
    PAYSAGE = 0
    PARTICULAR = 0

    Les valeurs des attributs (name) sont bien récupérées au niveau d'un startElement() mais je n'arrive pas à gérer l'extraction de la valeur de la balise, sélectionnée par rapport à la valeur de l’attribut, au niveau de la méthode characters()

    Auriez vous un petite idée ?

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Quand tu es dans startElement(), et que tu as repéré l'attribut name, tu dois le stocker comme un état actuel de ton ContentHandler : "la dernière fois que j'ai ouvert un <SimpleData> c'était sur name='DIMENSION'"

    Comme ça, quand tu arrives dans characters(), tu n'as plus qu'à regarder cet état, pour savoir de quoi il s'agit.
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    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
    Merci Thelvin pour l'aide.

    En suivant ces conseils, j'arrive donc bien au résultat escompté qui était de récupérer la valeur de la balise <SimpleData> quand la valeur de l'attribut "name = DIMENSION".

    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 class TestXml {
     
    	static class ParserSax extends DefaultHandler {
    		private boolean inSimpleNode;
    		private boolean inSimpleAttrib;
     
    		public ParserSax() {
    			super();
    		}
     
    		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    			if (qName.equals("SimpleData")) {
    				inSimpleNode = true;
    				for (int index = 0; index < attributes.getLength(); index++){
    					if (attributes.getValue(index).equals("DIMENSION")){
    						System.out.print(attributes.getValue(index) + " => ");
    						inSimpleAttrib = true;						
    					}
    				}
    			}
    		}
     
    		public void endElement(String uri, String localName, String qName) throws SAXException {
    			if (qName.equals("SimpleData")) {
    				inSimpleNode = false;
    				inSimpleAttrib = false;				
    			}
    		}
     
    		public void characters(char[] ch, int start, int length) throws SAXException {
    			String lecture = new String(ch, start, length);
    			if (inSimpleNode && inSimpleAttrib){
    				System.out.println(lecture);
    			}
     
    		}
     
    	}
     
    	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    		FileInputStream inputStream = new FileInputStream("data.kml");
    		ParserSax gestionnaire = new ParserSax();
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur = fabrique.newSAXParser();
    		parseur.parse(inputStream, gestionnaire);
     
    	}
    }

  4. #4
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Bien qu'en pratique je pense que ça n'arrivera jamais, en théorie characters() peut être appelé en plusieurs fois. Genre pour un élément qui contient "salut tout le monde", characters() sera appelé une fois avec "salut t", une autre fois avec "out le m" et encore une fois avec "onde".

    Donc il vaudrait mieux stocker ce que tu vois dans characters() dans un StringBuilder, et l'afficher seulement à la fermeture de l'élément.
    (Ou alors si tu veux jouer le jeu de SAX, ne fais pas des println(). Fais juste des print() et ajoute une fin de ligne à la fermeture de l'élément.)
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    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
    Le résultat est correct, mais je ne suis pas sûr que ce soit la bonne façon de coder pour le StringBuilder.
    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
     
    public class TestXml {
     
    	static class ParserSax extends DefaultHandler {
    		private boolean inSimpleNode;
    		private boolean inSimpleAttrib;
    		private StringBuilder buffeur; 
     
    		public ParserSax() {
    			super();
    	}
     
    		public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException {
    			buffeur = new StringBuilder();				
    			if (qName.equals("SimpleData")) {
    				inSimpleNode = true;
    				for (int index = 0; index < attributes.getLength(); index++){
    					if (attributes.getValue(index).equals("DIMENSION")){
    						System.out.print(attributes.getValue(index) + " => ");
    						inSimpleAttrib = true;						
    					}
    				}
    			}
    		}
     
    		public void endElement(String uri, String localName, String qName) throws SAXException {
    			if (qName.equals("SimpleData")) {
    				inSimpleNode = false;
    				if (inSimpleAttrib == true)
    					System.out.println(buffeur);
    					inSimpleAttrib = false;				
    			}
    		}
     
    		public void characters(char[] ch, int start, int length) throws SAXException {
    			String lecture = new String(ch, start, length);
    			if (inSimpleNode && inSimpleAttrib){
    				buffeur.append(lecture);
    			}
     
    		}
     
    	}
     
    	public static void main(String[] args) throws ParserConfigurationException, SAXException, IOException {
    		FileInputStream inputStream = new FileInputStream("data.kml");
    		ParserSax gestionnaire = new ParserSax();
    		SAXParserFactory fabrique = SAXParserFactory.newInstance();
    		SAXParser parseur = fabrique.newSAXParser();
    		parseur.parse(inputStream, gestionnaire);
     
    	}
    }

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Tu pouvais faire juste append(ch, start, length) au lieu de construire la String, mais à part ça, si c'est correct.
    Et t'étais pas obligé de reconstruire un nouveau StringBuilder à chaque fois, tu peux juste faire setLength(0) dessus. Ça ne change pas grand-chose au final.
    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. pb récupération valeur d'une applet dans javascript
    Par stefpoisson dans le forum Applets
    Réponses: 2
    Dernier message: 21/08/2006, 16h25
  2. test valeur d'une balise?
    Par -ADX- dans le forum XSL/XSLT/XPATH
    Réponses: 5
    Dernier message: 22/05/2006, 11h38
  3. Récuperer la valeur d'une balise html
    Par spynux dans le forum API standards et tierces
    Réponses: 2
    Dernier message: 28/02/2006, 09h40
  4. recupere valeur d'une balise select
    Par naourass dans le forum Général JavaScript
    Réponses: 9
    Dernier message: 03/11/2005, 10h18
  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, 11h47

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