EPITA
XML et les services Web

Jean-François Perrot


XPath en Java


  1. Principe
  2. Exemple
  3. Contexte de l'évaluation
  4. Compilation de l'expression
  5. Pour en savoir plus

Principe

Le package javax.xml.xpath est disponible depuis Java 1.5.0

http://java.sun.com/j2se/1.5.0/docs/api/javax/xml/xpath/package-summary.html

Comme l'explique Elliotte Rusty Harold, sur cette API deux langages se rencontrent, avec chacun leur système conceptuel :
XPath qui parle de NodeSets, de Nodes, de Strings, de Booleans et de Numbers, et Java-DOM qui connaît des NodeLists, et aussi des Nodes, des Strings, des Booleans et des Numbers, mais sans aucun doute en des sens différents.
On va donc y trouver une traduction.

Les objets XPath sont dotés d'une méthode evaluate

Exemple

  1. On obtient on objet XPath par
    XPath xp = XPathFactory.newInstance().newXPath();


  2. Une InputSource s'obtient directement à partir du nom du fichier :
    InputSource ip = new InputSource("Nom_note1.xml");

  3. Une expression XPath bien adaptée à ce fichier : String exp = "/liste/eleve[@note=20]"

  4. la constante est l'un des 5 attributs static de la classe XPathConstants 
Avec ce matériel nous pouvons demander [ tous ces essais sont rassemblés dans le fichier EssaiXPath.java]

Contexte de l'évaluation

Il s'agit du deuxième argument de xp.evaluate. Il désigne le document XML dans lequel la recherche va s'effectuer.
Comme nous venons de le voir, ce document peut être donné par une InputSource,
mais il peut aussi bien se réaliser
On peut donc remplacer dans le code expérimental ci-dessus
InputSource ip = new InputSource("Nom_note1.xml");
par
Exemple : fichier HistoXPath.java,
qui donne une autre réalisation de la transformation tableau de notes --> histogramme
où la partie centrale de la construction est effectuée en une seule boucle par :

	BufferedReader entree = new BufferedReader(new FileReader(nomFich));
Element liste = NNTxt2Xml.lireText(entree).getDocumentElement();

XPath xp = XPathFactory.newInstance().newXPath();

for( int i = 0; i < nmax ; i++ ){
Element nbr = histo.createElement("number");
val.appendChild(nbr);
String expr = "count(eleve[@note="+i+"])";
String combien = (String) xp.evaluate(expr, liste, XPathConstants.STRING);
nbr.appendChild(histo.createTextNode(combien));
}

Compilation de l'expression

Si une même requête doit être souvent répétée, on gagnera en efficacité par
XPathExpression cexpr = xp.compile(expr);
Object res = cexpr.evaluate(ip, typeDeRetour);
sans rien changer à la suite.

Pour en savoir plus

notamment sur la conduite à tenir en présence de namespaces,
voir http://www.ibm.com/developerworks/library/x-javaxpathapi.html.