Voici un petit exemple de mise en œuvre des APIS XPATH de java 1.5 s'appuyant sur Sax :
Voici le fichier XML source :
<?xml version="1.0" encoding="ISO-8859-1"?>
<level1>
<level2 level2-attribute1="valueOfLevel2-attribute1">
<level3 level3-attribute1="valueOfLevel3-attribute1">
<level41>valueOfLevel41</level41>
<level42>valueOfLevel42</level42>
</level3>
</level2>
</level1>
le code "technique" :...
import java.io.InputStream;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathExpressionException;
import javax.xml.xpath.XPathFactory;
import org.xml.sax.InputSource;
...
public static String executeXpath(InputStream sourceXml, String xPathQuery)
throws XPathExpressionException {
// creation de la source sax
InputSource source = new InputSource(sourceXml);
// creation de la requete XPTAH
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xpath = xPathFactory.newXPath();
XPathExpression xPathExpression = xpath.compile(xPathQuery);
/* execution de la requete xPath sur le fichier XML */
String resultat = (String) xPathExpression.evaluate(source,
XPathConstants.STRING);
return resultat;
}
...
}
La mise en œuvre :public static void main(String[] args) {
try {
/* recuperation du flux xml */
InputStream xml = null;
String result = null;
String xPathQuery = null;
/* exemple 1 */
xml = Main.class.getResourceAsStream("/fichier.xml");
xPathQuery = "/level1/level2/@level2-attribute1";
result = XpathHelper.executeXpath(xml, xPathQuery);
System.out.println("xpathQuery : " + xPathQuery
+ "---> resultat : " + result);
/* exemple 2 */
xml = Main.class.getResourceAsStream("/fichier.xml");
xPathQuery = "/level1/level2/level3/level41";
result = XpathHelper.executeXpath(xml, xPathQuery);
System.out.println("xpathQuery : " + xPathQuery
+ "---> resultat : " + result);
} catch (XPathExpressionException e) {
e.printStackTrace();
}
}
Le résultat en console :
xpathQuery : /level1/level2/@level2-attribute1---> resultat : valueOfLevel2-attribute1
xpathQuery : /level1/level2/level3/level41---> resultat : valueOfLevel41
Le tout a le mérite d'être assez simple, élégant et performant.
3 comments:
J'ai mis en ligne sur mon blog, une classe java de gestion des requêtes Xpath avec mise en cache des expressions XPath compilées, pour récupérer le source c'est cette adresse: http://www.devbypractice.com/cache-de-requete-xpath-java/
Cela ne semble pas fonctionner avec un namespace particulier.
Exemple si dan sle fichier xml on a
blabla
la requete
*[dc:title] ne fonctionnera pas.
Une idée ?
Tout à fait exact, si tu utilises un namespace, il faut mettre en place une classe de type NameSpaceContext comme documenté ici : http://xml.apache.org/xalan-j/xpath_apis.html#namespacecontext
Post a Comment