Accueil
Accueil
Le
Club
Delphi
Kylix
C
C++
Java
J2EE
DotNET
& C#
Visual
Basic
Access
Pascal
Dev
Web
PHP
ASP
XML
UML
SQL
SGBD
Win
Linux
Autres



Qu'est ce que XPath ? Pourquoi l'utiliser ?
auteur : Ioan Calapodescu
XPath, ou XML Path Language, est un langage dont le but premier est de permettre la "sélection" de noeuds d'un document XML. Cette "sélection" se fait grâce à un système d'adressage que l'on pourrait comparer aux URL. En plus de cela, XPath fournit un ensemble de fonctions sur les chaînes de caractères ou encore des fonctions permettant d'effectuer des tests.
XPath peut être utilisé en combinaison avec XSLT et XPointer. Pour découvrir toutes les possibilités de ce langage, vous pouvez regarder la spécification du W3C à cette adresse : http://www.w3.org/TR/xpath.

Nous ne nous attarderons pas sur les complexités de ce langage. De plus, la spécification n'étant pas toujours évidente à décoder vous pouvez regarder "Où trouver des informations et cours sur le langage XPath lui-même ?" pour de plus amples informations.

Cette partie de la FAQ se contentera de vous fournir les bases nécessaires à l'utilisation du package javax.xml.xpath appartenant au JDK standard depuis Java 5.0. Pour l'utilisation de XPath avec d'autres API ou l'utilisation de ce package avec des JDK antérieurs au 5.0, vous pouvez suivre ces liens :


lien : Où trouver des informations et cours sur le langage XPath lui-même ?
lien : Je n'ai pas le dernier JDK. Comment faire pour avoir accès à toutes les fonctionnalités de JAXP ?
lien : Comment travailler avec XPath si je n'ai pas Java 5.0 ?

Comment fonctionne le package javax.xml.xpath ?
auteur : Ioan Calapodescu
Voici un schéma simplifié du fonctionnement du package javax.xml.xpath :

Le principe est simple. On commence par récupérer une instance de XPath à partir d'une fabrique (XPathFactory). Ensuite, on construit une source XML (InputSource) à partir du document XML sur lequel on veut travailler. Il ne reste plus qu'à construire une XPathExpression à partir du XPath. Cette XPathExpression va retourner (grâce à sa méthode evaluate()) un Object qui peut correspondre à un NodeSet, un Node, un String, un Number ou un Boolean.

Pour voir le code exécutant ces opérations regardez : Comment obtenir une XPathExpression ?

Attention : NODE, NUMBER, STRING, etc. sont des instances de QName définies comme des constantes de la classe XPathConstants. Il ne faut pas les confondre avec des "vrais" String ou Number. Pour plus d'informations, regardez : Que fait exactement la méthode evaluate ?.

lien : Comment obtenir une XPathExpression ?
lien : Que fait exactement la méthode evaluate ?

Comment obtenir une XPathExpression ?
auteur : Ioan Calapodescu
Voici deux méthodes statiques montrant comment créer une instance de XPath et lui faire évaluer une XPathExpression.

Exemple avec un Document DOM :

public static void evaluerDOM(Document document, String expression, QName retour){ try{ //création du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //évaluation de l'expression XPath XPathExpression exp = xpath.compile(expression); Object resultat = exp.evaluate(document,retour); System.out.println(resultat); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } }
Exemple avec une InputSource SAX :

public static void evaluerSAX(File fichier, String expression, QName retour){ try{ //création de la source InputSource source = new InputSource(new FileInputStream(fichier)); //création du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); //évaluation de l'expression XPath XPathExpression exp = xpath.compile(expression); Object resultat = exp.evaluate(source,retour); System.out.println(resultat); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); }catch(IOException ioe){ ioe.printStackTrace(); } }
Informations supplémentaires :
On peut noter qu'on n'est pas obligé de passer par une instance de XPathExpression. En effet, la classe XPath dispose elle aussi d'une méthode evaluate().
Ainsi, on pourrait remplacer le code de la première méthode par :

XPath xpath = XPathFactory.newInstance().newXPath(); Object resultat = xpath.evaluate(expression,document,retour);
Pour connaître tous les arguments et types de retour possibles pour la méthode evaluate() regardez : Que fait exactement la méthode evaluate ?

Vous pouvez télécharger un exemple simple d'utilisation de ces deux méthodes ci-dessous.

lien : Que fait exactement la méthode evaluate ?
téléchargement : ExempleXPath.zip

Que fait exactement la méthode evaluate ?
auteur : Ioan Calapodescu
Que ce soit dans la classe XPath ou dans XPathExpression, la méthode evaluate() a quatre variantes. Pour toutes ces méthodes, l'argument de type String nommé expression correspond à l'expression XPath à évaluer.

Arguments Retour Description
String expression, Object item, QName returnType Object L'argument item correspond à un élément XML à évaluer. Celui-ci peut être un Document, un DocumentFragment, un Node ou encore une NodeList (package org.w3c.dom). L'argument returnType doit être une des constantes de la classe XPathConstants : NUMBER, STRING, BOOLEAN, NODE ou NODESET (une IllegalArgumentException est levée sinon). Cet argument définit simplement le type de l'Object retourné par la méthode (voir tableau ci-dessous).
String expression, Object item String Cette méthode a le même comportement que evaluate(expression, item, returnType) avec returnType égal à XPathConstants.STRING.
String expression, InputSource source, QName returnType Object L'argument source correspond à la source XML à évaluer. Celle-ci doit être une InputSource (package org.xml.sax). L'argument returnType doit être une des constantes de la classe XPathConstants : NUMBER, STRING, BOOLEAN, NODE ou NODESET (une IllegalArgumentException est levée sinon). Cet argument définit simplement le type de l'Object retourné par la méthode (voir tableau ci-dessous).
String expression, InputSource source String Cette méthode a le même comportement que evaluate(expression, source, returnType) avec returnType égal à XPathConstants.STRING.
Les types de retour correspondent à la spécification XPath 1.0 : http://www.w3.org/TR/xpath. Voici les correspondances entre les constantes de XPathConstants (instances de QName) et les types de retour de la méthode evaluate :

QName Type de retour Description
XPathConstants.NODE org.w3c.dom.Node Quand un Node est requis comme type de retour, la méthode evaluate() retourne une instance de org.w3c.Node correspondant au premier noeud satisfaisant l'expression XPath.
XPathConstants.NODESET org.w3c.dom.NodeList Quand un NodeSet est requis comme type de retour, la méthode evaluate() retourne une instance de org.w3c.NodeList correspondant aux noeuds sélectionnés par l'expression XPath.
XPathConstants.STRING java.lang.String Quand un String est requis comme type de retour la méthode evaluate() retourne le contenu du ou des noeuds satisfaisant l'expression XPath (enfants compris).
XPathConstants.BOOLEAN java.lang.Boolean Quand un Boolean est requis comme type de retour la méthode evaluate() retourne Boolean.TRUE si au moins un noeud est sélectionné, Boolean.FALSE sinon.
XPathConstants.NUMBER java.lang.Double Quand un Number est requis comme type de retour la méthode evaluate() essaye de transformer le contenu du noeud sélectionné en Double.
Pour un exemple pratique d'utilisation de chacune de ces méthodes regardez les liens ci-dessous.


lien : Comment récupérer un ensemble de noeuds avec XPath ?
lien : Comment récupérer un Node avec XPath ?
lien : Comment récupérer un booléen à partir d'une expression XPath ?
lien : Comment récupérer une chaîne de caractères avec XPath ?
lien : Comment récupérer un nombre à partir d'une expression XPath ?

Comment utiliser les espaces de nommage avec XPath ?
auteur : Ioan Calapodescu
Pour utiliser les espaces de nommage, vous pouvez utiliser la méthode setNamespaceContext(NamespaceContext) de la classe XPath. Par exemple :

NamespaceContext namespace = new NamespaceContext(){ public String getNamespaceURI(String prefix){ if("content".equals(prefix)){ return "http://purl.org/rss/1.0/modules/content/"; }else{ return null; } } public String getPrefix(String namespaceURI){ if("http://purl.org/rss/1.0/modules/content/".equals(namespaceURI)){ return "content"; }else{ return null; } } public Iterator getPrefixes(String namespaceURI){ return null; } }; XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); xpath.setNamespaceContext(namespace);
Pour voir un exemple d'utilisation, regardez : Comment récupérer une chaîne de caractères avec XPath ?

lien : Comment récupérer une chaîne de caractères avec XPath ?

Comment récupérer un ensemble de noeuds avec XPath ?
auteur : Ioan Calapodescu
Voici un exemple permettant de récupérer un NodeSet (org.w3c.dom.NodeList) à partir d'une expression XPath.

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; }
On peut utiliser cette méthode pour, par exemple, récupérer l'ensemble des titres des articles publiés (RSS 2.0) sur le blog de developpez.com.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "//item/title"; System.out.println("Articles disponibles sur le blog de developpez.com"); NodeList liste = evaluer(url.openStream(),expression); if(liste != null){ for(int i=0; i<liste.getLength(); i++){ Node node = liste.item(i); System.out.println(node.getTextContent()); } }
Vous pouvez télécharger cet exemple ci-dessous.

téléchargement : NodeSetXPath.java

Comment récupérer un Node avec XPath ?
auteur : Ioan Calapodescu
Voici une méthode permettant de récupérer un Node (package org.w3c.dom) avec XPath.

public static Node evaluer(InputStream stream, String expression){ Node node = 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); node = (Node)exp.evaluate(source,XPathConstants.NODE); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return node; }
On peut utiliser cette méthode, par exemple pour récupérer le titre du premier article publié sur le blog de developpez.com (RSS 2.0).

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=12"); String expression = "rss/channel/item/title"; Node node = evaluer(url.openStream(),expression); System.out.println(node.getTextContent());
Vous pouvez télécharger l'exemple ci-dessous.

téléchargement : NodeXPath.java

Comment récupérer un booléen à partir d'une expression XPath ?
auteur : Ioan Calapodescu
Voici une méthode permettant de récupérer un booléen (java.lang.Boolean) avec XPath.

public static Boolean evaluer(InputStream stream, String expression){ Boolean b = 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); b = (Boolean)exp.evaluate(source,XPathConstants.BOOLEAN); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return b; }
Cette méthode peut être utilisée, par exemple, pour vérifier si le dernier article publié sur le blog de developpez.com appartient à la rubrique Java.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "rss/channel/item[position()=1 and contains(./link/text(),'blog=12')]"; Boolean b = evaluer(url.openStream(),expression); String s = ""; if(b){ s = "Le premier message du blog de developpez.com appartient à la rubrique Java"; }else{ s = "Le premier message du blog de developpez.com n'appartient pas à la rubrique Java"; } System.out.println(s);
Cet exemple est téléchargeable ci-dessous.

téléchargement : BooleanXPath.java

Comment récupérer une chaîne de caractères avec XPath ?
auteur : Ioan Calapodescu
Voici une méthode permettant de récupérer une chaîne de caractères (java.lang.String) à partir de XPath.

public static String evaluer(InputStream stream, String expression, NamespaceContext namespace){ String string = null; try{ //création de la source InputSource source = new InputSource(stream); //création du XPath XPathFactory fabrique = XPathFactory.newInstance(); XPath xpath = fabrique.newXPath(); if(namespace != null){ xpath.setNamespaceContext(namespace); } //évaluation de l'expression XPath XPathExpression exp = xpath.compile(expression); string = (String)exp.evaluate(source,XPathConstants.STRING); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return string; }
On peut utiliser cette méthode pour, par exemple, récupérer le contenu du premier article publié (RSS 2.0) sur le blog de developpez.com. Ce contenu peut être directement affiché dans un JTextPane.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=1"); String expression = "//item/content:encoded"; NamespaceContext namespace = new NamespaceContext(){ public String getNamespaceURI(String prefix){ if("content".equals(prefix)){ return "http://purl.org/rss/1.0/modules/content/"; }else{ return null; } } public String getPrefix(String namespaceURI){ if("http://purl.org/rss/1.0/modules/content/".equals(namespaceURI)){ return "content"; }else{ return null; } } public Iterator getPrefixes(String namespaceURI){ return null; } }; String article = evaluer(url.openStream(),expression,namespace); JTextPane pane = new JTextPane(); pane.setContentType("text/html"); pane.setPreferredSize(new Dimension(200,200)); JScrollPane scroll = new JScrollPane(pane); JFrame frame = new JFrame(); //etc. frame.setVisible(true); pane.setText(article);
Cet exemple est téléchargeable ci-dessous.

téléchargement : StringXPath.java

Comment récupérer un nombre à partir d'une expression XPath ?
auteur : Ioan Calapodescu
Voici une méthode permettant de récupérer un nombre (java.lang.Double) à partir de XPath.

public static Double evaluer(InputStream stream, String expression){ Double number = 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); number = (Double)exp.evaluate(source,XPathConstants.NUMBER); }catch(XPathExpressionException xpee){ xpee.printStackTrace(); } return number; }
Cette méthode peut être utilisée pour, par exemple, compter le nombre de news concernant J2EE et publiées (RSS 2.0) sur le blog de la rubrique Java.

URL url = new URL("http://blog.developpez.com/xmlsrv/rss2.php?blog=12"); String expression = "count(rss/channel/item/category[text()='3. Technologie J2EE'])"; Double number = evaluer(url.openStream(),expression); System.out.println("Il y a "+number+" news J2EE sur le blog de la rubrique Java");
Cet exemple est téléchargeable ci-dessous.

téléchargement : NumberXPath.java

Comment travailler avec XPath si je n'ai pas Java 5.0 ?
auteur : Ioan Calapodescu
Depuis J2SE 5.0 (Tiger), l'API standard contient le package javax.xml.xpath, qui permet de travailler avec XPath. Plus d'informations dans la description du package.

Pour les versions antérieures de Java, il faut regarder du côté d'autres API comme Xalan-Java 2.6.0: Package org.apache.xpath (NB : cette API était incluse dans J2SE 1.4). On peut aussi noter l'API JDom qui permet de travailler avec XPath.

Enfin, n'oubliez pas que vous pouvez télécharger JAXP de manière indépendante : https://jaxp.dev.java.net/


Où trouver des informations et cours sur le langage XPath lui-même ?
auteur : Ioan Calapodescu
Pour plus d'informations sur XPath lui-même vous pouvez suivre ces liens :




Consultez les autres F.A.Q's

Les codes sources présentés sur cette page sont libres de droits, et vous pouvez les utiliser à votre convenance. Pour le reste, ce document constitue une oeuvre intellectuelle protégée par les droits d'auteurs.

Ce document issu de http://www.developpez.com est soumis à deux licences, en fonction des contributeurs :

- Les contributions de Clément Cunin et Johann Heymes sont soumises aux termes de la la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies des contributions de Clément Cunin et Johann Heymes tant que cette note apparaît clairement :
"Ce document issu de http://www.developpez.com est soumis à la licence GNU FDL traduite en français ici. Permission vous est donnée de distribuer, modifier des copies de cette page tant que cette note apparaît clairement".

- Pour ce qui est des autres contributions : Copyright © 2004 Developpez LLC : Tous droits réservés Developpez LLC. Aucune reproduction, ne peux en être faite sans l'autorisation expresse de Developpez LLC. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts. Cette page est déposée à la SACD.
Vos questions techniques : forum d'entraide PHP - Publiez vos articles, tutoriels et cours
et rejoignez-nous dans l'équipe de rédaction du club d'entraide des développeurs francophones
Nous contacter - Copyright 2000..2004 www.developpez.com