
|
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.
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 ?
|
|
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{
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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{
InputSource source = new InputSource(new FileInputStream(fichier));
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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);
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
|
|
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 ?
|
|
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);
|
lien : Comment récupérer une chaîne de caractères 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{
InputSource source = new InputSource(stream);
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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 =
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
|
|
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{
InputSource source = new InputSource(stream);
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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
|
|
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{
InputSource source = new InputSource(stream);
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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
|
|
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{
InputSource source = new InputSource(stream);
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
if(namespace != null){
xpath.setNamespaceContext(namespace);
}
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 =
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();
frame.setVisible(true);
pane.setText(article);
Cet exemple est téléchargeable ci-dessous.
|
téléchargement : StringXPath.java
|
|
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{
InputSource source = new InputSource(stream);
XPathFactory fabrique = XPathFactory.newInstance();
XPath xpath = fabrique.newXPath();
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
|
|
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.
|
|
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.
|
|
|