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 :

XML Node et XPATH


Sujet :

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

  1. #1
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Par défaut XML Node et XPATH
    Bonjour,

    But : A partir d un fichier xml et d'un xpath je cherche à extraire :
    - une valeur
    - son xpath

    Vous me direz que j'ai deja le xpath, cependant dans mon cas je veux le xpath specifique à chaque donnée et non le xpath donnée pour la recherche.

    exemple :

    données initiales :
    xml : <xml><test><bob>1.0</bob><tod>2.0</tod></test></xml>
    xpath : /xml/test/*
    Resultat :
    { /xml/test/bob , 1.0 }
    { /xml/test/tod , 2.0 }
    Code

    A l'aide de la lib javax.xml, j'arrive à extraire à partir de mon xpath, une NodeList me permetant d'obtenir le contenu de chacun des noeuds.

    Cependant je ne trouve pas de methode me permetant à partir d'un object Node d'obtenir son Xpath, quelqu'un a t il une piste ? une autre lib ?

    J'ai directement exclu la piste de faire une méthode consistant à remonter noeud par noeud jusqu'à la racine et en extraire au fur et à mesure les informations. Il doit surement exister une méthode qui fait déjà cela.

    Merci.

    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
     
    public static void evaluerDOM(InputStream is, String expression){
    		NodeList liste = evaluer(is,expression);
     
    		if(liste != null){
    			for(int i=0 ; i < liste.getLength() ; i++){
    				Node node = liste.item(i);
    				System.out.println("node  : " + node.getTextContent());
    			}
    		}
    	}
     
    public static NodeList evaluer(InputStream stream, String expression){
    		NodeList liste = null;
    		try{
    			//création de la source
    			InputSource source = new InputSource(stream);
     
    			//création du XPath 
    			XPathFactory fabrique = XPathFactory.newInstance();
    			XPath xpath = fabrique.newXPath();
     
    			//évaluation de l'expression XPath
    			XPathExpression exp = xpath.compile(expression);
    			liste = (NodeList)exp.evaluate(source,XPathConstants.NODESET);
    		}catch(XPathExpressionException xpee){
    			xpee.printStackTrace();
    		}
    		return liste;
    	}

  2. #2
    Invité
    Invité(e)
    Par défaut
    Tiens, je me pose exactement la même question en ce moment.

    Pour le moment je n'ai rien trouvé dans le type Node qui permette de récupérer son Xpath dans le document... Et intuitivement je dirais que ça existe pas.

    A mon avis la seule façon d'avoir le chemin Xpath d'un Node c'est de le construire toi-même au fur et à mesure que tu lis le document.

    Pour mon appli je me contente de lire l'ensemble du document à partir de la racine en parcourant les descendants récursivement. Si tu fais comme ça tu peux construire le Xpath de toi-même au fur et à mesure.

    Mais si quelqu'un connait une méthode déjà présente dans l'API ce serait toujours ça de gagné.

  3. #3
    Membre éclairé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2007
    Messages
    241
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2007
    Messages : 241
    Par défaut
    Dans la librairie JDOM
    Tu regardes dans l'api la class XPath, tu as une méthode getXPath()

    Peut-etre est-ce ce que tu cherches, je n'ai pas testé

  4. #4
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Il ne suffirait pas de récupérer le nom de tous les ancêtres, il faudrait aussi récupérer soit, par exemple, la position de l'élément par rapport à cet ancêtre ou l'attribut id s'il est présent,...

    Un chemin XPath qui redonne le même noeud dans le même document alors que ce document vient d'être modifié, c'est difficile à garantir ! C'est très probablement pouquoi ce genre de fonction n'est pas disponible...

    Le mieux, quand on a ce besoin, ça reste d'avoir un id sur chaque élément intéressant (je ne vois pas comment on pourrait faire pareil sur les noeuds texte...) pour utiliser toujours le XPath :

  5. #5
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Par défaut
    • Lib JDom :
      La méthode getXPath() de la classe Xpath renvoit le xpath que tu recherche ( par exemple : /xml/test/* ) et non pas les xpaths des éléments matchés ( /xml/test/bob , /xml/test/tod ).
      Il faut utiliser selectNodes() pour extraire une Liste d'Elements ou d'Attributs ce qui nous renvoient à la question posé.

    • Id :
      Je ne comprend pas ou tu veux en venir avec cette histoire d'id et position de l'élément par rapport à cet ancêtre ou l'attribut ?
      Concernant l'intégrité des données, celles-ci ne peuvent être modifiées donc aucun problème vis a vis de lecture/ecriture concurrentes.

    • Solution Alternative :
      Pour le moment et en attendant de trouver une solution convenable, je remonte chacun des éléments renvoyés afin de construire le xpath.
      Cependant, la solution ne me plait guère étant donné que l'on descend dans le xml pour en extraire les noeuds puis on le remonte pour en extraire le xpath. Ce qui fait que l'on parcours le xml 2 fois alors que dès le premier parcours il serai possible de l'extraire.


    La Question reste en suspend ....

  6. #6
    Membre Expert Avatar de alain.couthures
    Profil pro
    Gérant
    Inscrit en
    Avril 2007
    Messages
    902
    Détails du profil
    Informations personnelles :
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Gérant

    Informations forums :
    Inscription : Avril 2007
    Messages : 902
    Par défaut
    Je voulais juste préciser que le nom des éléments ne suffit pas...

    Lorsque que le noeud test a des fils A, B ou C, il est nécessaire de dire /test/A[2] ou /test/C[1], donc relativment aux frères...

    L'attribut id pourrait permettre d'y aller directement : /test/A[@id='second']

  7. #7
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 32
    Par défaut
    Citation Envoyé par alain.couthures Voir le message
    Je voulais juste préciser que le nom des éléments ne suffit pas...

    Lorsque que le noeud test a des fils A, B ou C, il est nécessaire de dire /test/A[2] ou /test/C[1], donc relativment aux frères...

    L'attribut id pourrait permettre d'y aller directement : /test/A[@id='second']
    Je comprend ou tu veux en venir. Dans mon cas, l'identification unique de chacun des noeuds n'est pas nécéssaire, il me faut juste le Xpath complet, peu importe si celui-ci est le même pour plusieurs résultats.

    Exemple : test a 3 fils A le xpath sera alors 3 fois /test/A.

Discussions similaires

  1. [JAVA] XML Node et XPATH
    Par ecatum dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 11/01/2008, 09h38
  2. xml listbox et xpath
    Par Dargos30 dans le forum C#
    Réponses: 1
    Dernier message: 16/08/2007, 22h18
  3. system.xml.Xsl et xpath?
    Par samir dans le forum C#
    Réponses: 1
    Dernier message: 29/03/2007, 17h38
  4. [JDOM] XML Node JDOM
    Par quidam66 dans le forum Format d'échange (XML, JSON...)
    Réponses: 7
    Dernier message: 14/09/2005, 23h15
  5. Cours en Français sur XML-XSL et XPath
    Par Community Management dans le forum XSL/XSLT/XPATH
    Réponses: 0
    Dernier message: 25/04/2002, 15h46

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