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

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    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 chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    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 régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    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 régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    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 chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    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 régulier
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    231
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    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 chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Je viens de me rendre compte que dans la 1ère partie du code tu as mis :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(racine.getChild("body").getChild("presentation").getChild("page").getAttributeValue("name"));
    et dans afficheALL() tu fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.out.println(racine.getChild("body").getChild("office:presentation").getChild("page").getAttributeValue("name"));
    Est-ce normal que ce soit "office:presentation" et pas "presentation" comme le 1er ?
    Si c'est normal, c'est qu'il doit y avoir un élément "body" qui n'a pas de sous-élément "office:presentation". (si l'exception est bien sur body.getChild("office:presentation")

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    Par défaut
    Bonjour oui c 'est normal !!
    Ces des test

    çà marche pas quand meme. Mais ce que je sais c 'est que c 'est body et non office:body.

  9. #9
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Tu peux essayer ce code pour voir d'où viens le problème :

    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
     
    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")){
            	Element body, presentation, page;
                    body = getChild(courant, "body");
                    presentation = getChild(body, "office:presentation");
                    page = getChild(body, "page"); 
             }
          }
       }
     
    private Element getChild(Element parent, String childName) {
            if(parent == null || childName == null) {
                return null;
            }
     
            Element child = parent.getChild(childName);
     
            if(child == null) {
                System.out.println("----------");
                System.out.println("Noeud non trouvé : " + childName +
                    "\nLes noeuds présents sont : ");
                List childs = parent.getChildren();
                for(int i = 0 ; i < childs.size() ; i++) {
                    System.out.println(childs.get(i).getName());
                }
                System.out.println("----------");
            }
            return child;
        }

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    Par défaut
    Il ne trouve pas la méthode getName de la ligne suivante

    System.out.println(childs.get(i).getName());

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    Par défaut
    j ai casté et voila donc le résultat

    ok scripts
    ok automatic-styles
    ok body
    ----------
    Noeud non trouvé : body
    Les noeuds présents sont :
    presentation
    ----------

  12. #12
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Autant pour moi, il y a une erreur dans la boucle, il faut faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if (courant.getName().equals("body")){
         	presentation, page;
            presentation = getChild(body, "presentation");
            page = getChild(body, "page"); 
    }
    Les traces montrent bien que
    - le sous-élément de body est "presentation" et non "office:presentation" et que
    - le noeud courant est déja body donc il n'a pas de sous-élément "body".

    Tu aurais pu analyser un peu les traces

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    Par défaut
    oui effectivement
    Mais c 'est parce que j'ai fait ca à la va vite pour moi manger

    EN meme temps j'étais d'accord avec ca car j'avais deja fait cette découverte.

    Maintenant je dois obtenir les valeurs de sous sous elément de la balise présentation.
    Dois je donc faire une récursivité ou pas?

  14. #14
    Membre chevronné
    Avatar de CheryBen
    Inscrit en
    Mai 2005
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Âge : 42

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 599
    Points : 2 197
    Points
    2 197
    Par défaut
    Je n'ai jamais utilisé mais la fonction de recherche existe, par la méthode getDescendants(Filter filter) de la classe Element.

    Il suffit alors que tu créés un filtre, à peu prêt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class FiltreNoeud implements org.jdom.filter.Filter{
            private String _nom;
            public FiltreNoeud(String nom) {
                _nom = nom;
            }
            boolean matches(Object obj) {
                return ((Element) obj).getName.equals(_nom);
            }
        }
    Et tu utilises comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Filtre filtre = new FiltreNoeud("page");
    Iterator it = racine.getDescendants(filtre);

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 231
    Points : 75
    Points
    75
    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