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 :

obtenir nom attribut d un niveau inférieur [XPATH]


Sujet :

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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut obtenir nom attribut d un niveau inférieur
    Bonjour,

    J'essai d'obtenir la valeur d'un attribut d'une balise d'u niveau inférieur.

    <root>
    <N1>
    <N2>
    <N3 attributName>

    Mais j'y arrives pas il me dit NullPointerException . Ce qui m'embete.

    Je vous file mon code, j'ai fait différent essais et je me suis inspiré de votre faq

    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
    58
    59
    package xml;
    
    import java.io.*;
    import org.jdom.*;
    import org.jdom.input.*;
    import org.jdom.filter.*;
    import java.util.List;
    import java.util.Iterator;
    
    public class Xml
    {
       static org.jdom.Document document;
       static Element racine;
       public static void main(String[] args)
       {
          //On crée une instance de SAXBuilder
          SAXBuilder sxb = new SAXBuilder();
          try
          {
             //On crée un nouveau document JDOM avec en argument le fichier XML
             //Le parsing est terminé ;)
             document = sxb.build(new File("F:\\Master\\Java\\Eclipse\\Plearnet\\content.xml"));
             
          }
          catch(Exception e){}
          String noeud="body";
          //On initialise un nouvel élément racine avec l'élément racine du document.
          racine = document.getRootElement();
          System.out.println(racine.getName()); 
          System.out.println(racine.getChild("body").getChild("presentation").getChild("page").getAttributeValue("name"));
          Ici il me dit erreur . apparemment il connait pas les enfants alors qu ils existent 
          //Méthode définie dans la partie 3.2. de cet article
          afficheALL();
       }
       static void afficheALL()
       {
    	  
          //On crée une List contenant tous les noeuds "etudiant" de l'Element racine
          List listEtudiants = racine.getChildren();
    
          //On crée un Iterator sur notre liste
          Iterator i = listEtudiants.iterator();
    
          while(i.hasNext())
          {
    
             //On recrée l'Element courant à chaque tour de boucle afin de
             //pouvoir utiliser les méthodes propres aux Element comme :
             //selectionner un noeud fils, modifier du texte, etc...
             Element courant = (Element)i.next();
             //On affiche le nom de l'element courant
             System.out.println("ok "+courant.getName());
             if (courant.getName().equals("body")){
            	
            	 System.out.println(courant.getChild("office:presentation").getChild("page").getAttributeValue("name")); 
             }
          }
       }
    }
    Je vous remercie de votre aide.

  2. #2
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Salut, tu devrais diviser ton code (les getChild()) sur plusieurs lignes pour savoir exactement lequel renvoit null, le fichier xml ne doit pas correspondre à un endroit.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    ce que j'ai deja fait. Dès le premier niveau il ne trouve pas .

    et si je fais:
    racine=racine.getChild("body");
    il me dit NullPointerException

    Alors que dans la boucle il arrive a afficher le nom:
    courant.getName()
    qui me ressort body

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    Petite précision , le fichier xml provient d'une archive odp qui est une présentation OpenOffice

    Effectivement pour un autre fichier xml ma classe fonctionne bien , j'arrive à changer de racine. Mais pas pour le fichier content.xml d une archive odp.

    Vous auriez une idée du pourquoi?

  5. #5
    Membre Expert
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 43

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Par défaut
    Il faudrait mettre System.out.println( e ); dans le catch, il doit y avoir une exception de parsing ou il ne trouve pas le fichier.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    Citation Envoyé par morph41 Voir le message
    Il faudrait mettre System.out.println( e ); dans le catch, il doit y avoir une exception de parsing ou il ne trouve pas le fichier.

    si il trouve mon fichier car dans ma boucle il affiche bien body . mais il ne veut pas changer la racine .

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Par défaut
    Bonjour,

    Bon j ai fait pas mal d'essai.

    J'ai donc utilisé XPAth.

    J'arrives à obtenir le contenu de mes balises voulues mais pas idéalement.

    Je vous montre.

    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
    58
    59
    60
    package xml;
     
     
    import java.util.List;
    import java.util.Iterator;
    import java.io.File;
    import org.jdom.Element;
    import org.jdom.JDOMException;
    import org.jdom.input.SAXBuilder;
    import org.jdom.xpath.XPath;
     
    public class Xml
    {
    	static org.jdom.Document document;
    	static Element racine;
    	public static void main(String[] args)
    	{
    		//On crée une instance de SAXBuilder
    		SAXBuilder sxb = new SAXBuilder();
    		try
    		{
    			//On crée un nouveau document JDOM avec en argument le fichier XML
    			//Le parsing est terminé ;)
    			document = sxb.build(new File("h:\\Master\\Java\\Eclipse\\Plearnet\\content.xml"));
    			//On initialise un nouvel élément racine avec l'élément racine du
    			// document.
    			racine = document.getRootElement();
    			XPath xpa = XPath.newInstance("//draw:page");
     
    			List results = xpa.selectNodes(racine) ;
    			Iterator iter = results.iterator() ;
    			Element noeudCourant = null;
    			String personneId = null ;
    			while (iter.hasNext()){
    				/* Pour chaque patient nous allons chercher son nom puis l'afficher */
    				noeudCourant = (Element) iter.next();
    				XPath xpa2 = XPath.newInstance("./@draw:name");
    				personneId = xpa2.valueOf(noeudCourant);
     
    				if (personneId.equals("page1")){
     
    					xpa = XPath.newInstance("//draw:page[@draw:name='" + personneId + "']");
    					noeudCourant = (Element) xpa.selectSingleNode(noeudCourant);
    					/* Nous cherchons à présent la valeur de la balise nom :                */
    	                xpa = XPath.newInstance("//text-span");
    	                System.out.println(noeudCourant.getValue());
     
    				}
     
    			}
    		}
    		catch (JDOMException e) {
    			System.out.println("Erreur JDOM " + e.getMessage() );
    			e.printStackTrace();            
    		} 
    		catch(Exception e){}
     
    	}
     
    }
    Mon fichier xml:
    <office:document-content office:version="1.1">
    <office:automatic-styles>
    <office:body>
    <office:presentation>
    <draw:page draw:name="page1" draw:style-name="dp1" draw:master-page-name="Standard" presentation:presentation-page-layout-name="AL1T0">
    <office:forms form:automatic-focus="false" form:apply-design-mode="false"/>

    <draw:frame presentation:style-name="pr1" draw:text-style-name="P2" draw:layer="layout" svg:width="21.59cm" svg:height="4.869cm" svg="1.905cm" svg:y="6.35cm" presentation:class="title" presentation:user-transformed="true">

    <draw:text-box>

    <text:p text:style-name="P1">

    <text:span text:style-name="T1">
    Conduite à tenir devant une suspicion de déclin intellectuel
    </text:span>
    </text:p>
    </draw:text-box>
    </draw:frame>
    Le résultat qui sort
    Conduite à tenir devant une suspicion de déclin intellectuelXXX XXXCentre Mémoire de Ressources et de Recherche XXX de XXX
    ALors qu j aurai du obtenir
    Conduite à tenir devant une suspicion de déclin intellectuel
    XXX XXX
    Centre Mémoire de Ressources et de Recherche XXX de XXX
    Il faut que j'obtiennes les valeurs des balises text-span mais de manière séparée. Ici l'appel de la méthode System.out.println(xpa.valueOf(noeudCourant));
    me donne les valeurs dans un seul résultat?

    Comment puis je faire pour avoir les valeurs de text-span séparemmenT???

    Merci beaucoup

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 14/08/2007, 10h31
  2. [DOM4J] récupérer chemin avec nom attribut
    Par jenny1985 dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 12/07/2007, 17h24
  3. Capturer le nom du dossiers dernier niveau?
    Par budhax dans le forum Scripts/Batch
    Réponses: 11
    Dernier message: 05/07/2007, 20h11
  4. [C#][MDI] Désactiver la fonctionnalité "niveau inférieur"
    Par nicolas.pied dans le forum Windows Forms
    Réponses: 3
    Dernier message: 13/04/2007, 16h39
  5. deux tables avec meme nom attribut
    Par jolatouf dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 11/05/2006, 14h21

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