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 :

Accéder à la valeur d'un élément


Sujet :

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

  1. #1
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut Accéder à la valeur d'un élément
    Bonjour,

    je cherche à accéder à la valeur spécifique d'un élément pour l'afficher, mais je n'y arrive pas.

    Voici mon fichier xml

    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
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    <?xml version="1.0" encoding="ISO-8859-1" standalone="yes"?>
    <!--
      EB_IS_2009: Editorial boards of Information System journals (JCR 2009 edition)
      @version 31-MAY-2011
     
    -->
    <!DOCTYPE boards [
    <!ELEMENT boards (journal)+>
    <!ELEMENT journal (titleISI , titleDBLP , isbn , publisher , if5years , researcher+)>
    <!ELEMENT titleISI (#PCDATA)>
    <!ELEMENT titleDBLP (#PCDATA)>
    <!ELEMENT isbn (#PCDATA)>
    <!ELEMENT if5years (#PCDATA)>
    <!ELEMENT publisher (#PCDATA)>
    <!ELEMENT researcher (#PCDATA)>
    <!ATTLIST researcher sex (m | f | n) #REQUIRED>
    <!ATTLIST researcher country CDATA #REQUIRED>
    <!ATTLIST researcher level CDATA #REQUIRED>
    ]    >
    <boards>
      <journal>
        <titleISI>Mis Quart</titleISI>
        <titleDBLP>MIS Quarterly</titleDBLP>
        <isbn>0276-7783</isbn>
        <publisher>U. Minnesota</publisher>
        <if5years> 9.208</if5years>
        <researcher sex="m" country="us" level="3">Detmar W. Straub</researcher>
        <researcher sex="f" country="sg" level="2">Soon Ang</researcher>
        <researcher sex="m" country="us" level="1">Youngjin Yoo</researcher>
      </journal>
     
      <journal>
        <titleISI>VLDB J</titleISI>
        <titleDBLP>VLDB J.</titleDBLP>
        <isbn>1066-8888</isbn>
        <publisher>Springer</publisher>
        <if5years> 6.987</if5years>
        <researcher sex="m" country="us" level="4">Philip A. Bernstein</researcher>
        <researcher sex="m" country="dk" level="4">Christian S. Jensen</researcher>
        <researcher sex="m" country="sg" level="4">Kian-Lee Tan</researcher>
      </journal>
     
      <journal>
        <titleISI>ACM T Inform Syst</titleISI>
        <titleDBLP>ACM Trans. Inf. Syst.</titleDBLP>
        <isbn>1046-8188</isbn>
        <publisher>ACM</publisher>
        <if5years> 5.774</if5years>
        <researcher sex="m" country="us" level="1">ChengXiang Zhai</researcher>
        <researcher sex="f" country="us" level="1">Yi Zhang</researcher>
        <researcher sex="m" country="au" level="1">Justin Zobel</researcher>
      </journal>
     
     
    </boards>


    Et mon code java simplifié correspondant au problème

    inISI est un booléan me permettre de détecter quand est-ce que je suis dans l'élément à afficher. Si on dé-commente l'affichage c'est titleISI qui s'affiche, et je cherche donc à avoir le contenu de l'élément.
    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
    public void startElement(String uri, String localName, String qName,
    			Attributes attributes) throws SAXException {
    		...
    		if(previoustitleISI.equals("journal")){
    			//end elem
    			nbJournal++;
     
    			if(nbJournal>=2){
    				firstJournal=true;
    				inISI = true; 
    		        element1Content = new StringBuffer();
    				//System.out.println("titleISI: "+element1Content);
     
     
    			}
    Sauf que le soucis, c'est que le code suivant qui devrait ne m'afficher que le contenu de l'élément que je veux, m'affiche en réalité le fichier dans sa globalité !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public void characters(char[] ch, int start, int length)
    			throws SAXException {
    		if (inISI) {
    	        element1Content.append(ch);
    	        System.out.println("titleISI: "+element1Content);
    	    }
    		inISI=false;
    	}
    Merci pour votre aide.

  2. #2
    Modérateur
    Avatar de joel.drigo
    Homme Profil pro
    Ingénieur R&D - Développeur Java
    Inscrit en
    Septembre 2009
    Messages
    12 430
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D - Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2009
    Messages : 12 430
    Billets dans le blog
    2
    Par défaut
    Salut,

    Tu oublies d'utiliser les paramètres start et length :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    element1Content.append(ch, start, length);
    2 autres choses :
    1. comme tu fais un test nbJournal>=2, tu auras 2 "journaux"
    2. Tu devrais utiliser plutôt StAX, plus simple :
      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
      public static void main(String[] args) {
      		try {
      			System.out.println(read("test.xml",2));
      		} catch (IOException | XMLStreamException | FactoryConfigurationError e) { 
      			e.printStackTrace();
      		}
      }
       
      public static String read(String source, int journal) throws IOException, XMLStreamException, FactoryConfigurationError {
       
      		try(InputStream inputStream=Files.newInputStream(Paths.get(source))) {
      			final XMLStreamReader r = XMLInputFactory.newInstance().createXMLStreamReader( inputStream );
       
      			try(InputStream inputStream=Files.newInputStream(Paths.get(source))) {
      			final XMLStreamReader r = XMLInputFactory.newInstance().createXMLStreamReader( inputStream );
       
      			int nbJournal=0;
      			StringBuilder stringBuilder = null;
      			boolean titleJournalFound=false;
      			boolean journalFound=false;
      			while(!titleJournalFound && r.hasNext()) {
      			    switch( r.next() ) {
      			    case XMLStreamReader.START_ELEMENT:
      			    	if ( "journal".equals(r.getLocalName()) ) {
      			    		nbJournal++;
      			    		if ( nbJournal==journal ) {
      			    			stringBuilder =new StringBuilder();
      			    			journalFound=true;
      			    		}
      			    	}
      			    	break;
      			    case XMLStreamReader.END_ELEMENT: 
      			    	if ( journalFound ) {
      			    		journalFound=false; 
      			    		titleJournalFound=true;
      			    	}
      			    	break;
      			    case XMLStreamReader.CHARACTERS:
      			    	if ( journalFound ) {
      			    		if ( stringBuilder.length()>0 ) {
      			    			stringBuilder.append(System.lineSeparator());
      			    		}
      			    		stringBuilder.append(r.getText());
      			    	}
      			    	break;
      			    }
      			}
      			return stringBuilder==null?null:stringBuilder.toString();
      		}
      }
    L'expression "ça marche pas" ne veut rien dire. Indiquez l'erreur, et/ou les comportements attendus et obtenus, et donnez un Exemple Complet Minimal qui permet de reproduire le problème.
    La plupart des réponses à vos questions sont déjà dans les FAQs ou les Tutoriels, ou peut-être dans une autre discussion : utilisez la recherche interne.
    Des questions sur Java : consultez le Forum Java. Des questions sur l'EDI Eclipse ou la plateforme Eclipse RCP : consultez le Forum Eclipse.
    Une question correctement posée et rédigée et vous aurez plus de chances de réponses adaptées et rapides.
    N'oubliez pas de mettre vos extraits de code entre balises CODE (Voir Mode d'emploi de l'éditeur de messages).
    Nouveau sur le forum ? Consultez Les Règles du Club.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2011
    Messages
    756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Haute Garonne (Midi Pyrénées)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 756
    Par défaut
    Salut et merci de ta réponse.

    C'était dans le cadre d'exos ou on utilisait xlst stax et dom.

    J'avais oublié avant mis ce message et entre temps j'avais compris le problème.

    Ta remarque est tout à fait pertinente sur le nombre de journaux, mais s'agissant d'un bête exos visant à nous faire découvrir l'api j'ai pas cherché à faire quoi que ce soit de performant^^

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

Discussions similaires

  1. Accéder aux valeurs des éléments d'une matrice
    Par alvinleetya dans le forum OpenCV
    Réponses: 5
    Dernier message: 01/10/2012, 16h19
  2. Accéder à une valeur d'un tableau associatif
    Par TigreRouge dans le forum Langage
    Réponses: 5
    Dernier message: 16/03/2006, 12h03
  3. Réponses: 2
    Dernier message: 12/01/2006, 18h14
  4. [XSL] afficher la valeur d'un élément du noeud parent
    Par luimême dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 08/12/2005, 12h08
  5. Faire du calcul avec la valeur d'un élément/attribut
    Par camboui dans le forum XML/XSL et SOAP
    Réponses: 4
    Dernier message: 03/11/2005, 16h10

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