Java Language
Évaluation XPath XML
Recherche…
Remarques
Les expressions XPath permettent de naviguer et de sélectionner un ou plusieurs nœuds dans un document d'arborescence XML, par exemple en sélectionnant un certain élément ou nœud d'attribut.
Voir cette recommandation du W3C pour une référence sur cette langue.
Évaluation d'un NodeList dans un document XML
Vu le document XML suivant:
<documentation>
<tags>
<tag name="Java">
<topic name="Regular expressions">
<example>Matching groups</example>
<example>Escaping metacharacters</example>
</topic>
<topic name="Arrays">
<example>Looping over arrays</example>
<example>Converting an array to a list</example>
</topic>
</tag>
<tag name="Android">
<topic name="Building Android projects">
<example>Building an Android application using Gradle</example>
<example>Building an Android application using Maven</example>
</topic>
<topic name="Layout resources">
<example>Including layout resources</example>
<example>Supporting multiple device screens</example>
</topic>
</tag>
</tags>
</documentation>
Les éléments suivants récupèrent tous les noeuds d' example
de la balise Java (utilisez cette méthode si vous n'évaluez qu'une seule fois XPath dans le fichier XML. Consultez d'autres exemples lorsque plusieurs appels XPath sont évalués dans le même fichier XML.):
XPathFactory xPathFactory = XPathFactory.newInstance();
XPath xPath = xPathFactory.newXPath(); //Make new XPath
InputSource inputSource = new InputSource("path/to/xml.xml"); //Specify XML file path
NodeList javaExampleNodes = (NodeList) xPath.evaluate("/documentation/tags/tag[@name='Java']//example", inputSource, XPathConstants.NODESET); //Evaluate the XPath
...
Analyse de plusieurs expressions XPath en un seul XML
En utilisant le même exemple que Evaluer un NodeList dans un document XML , voici comment vous pouvez effectuer plusieurs appels XPath efficacement:
Vu le document XML suivant:
<documentation>
<tags>
<tag name="Java">
<topic name="Regular expressions">
<example>Matching groups</example>
<example>Escaping metacharacters</example>
</topic>
<topic name="Arrays">
<example>Looping over arrays</example>
<example>Converting an array to a list</example>
</topic>
</tag>
<tag name="Android">
<topic name="Building Android projects">
<example>Building an Android application using Gradle</example>
<example>Building an Android application using Maven</example>
</topic>
<topic name="Layout resources">
<example>Including layout resources</example>
<example>Supporting multiple device screens</example>
</topic>
</tag>
</tags>
</documentation>
Voici comment utiliser XPath pour évaluer plusieurs expressions dans un document:
XPath xPath = XPathFactory.newInstance().newXPath(); //Make new XPath
DocumentBuilder builder = DocumentBuilderFactory.newInstance();
Document doc = builder.parse(new File("path/to/xml.xml")); //Specify XML file path
NodeList javaExampleNodes = (NodeList) xPath.evaluate("/documentation/tags/tag[@name='Java']//example", doc, XPathConstants.NODESET); //Evaluate the XPath
xPath.reset(); //Resets the xPath so it can be used again
NodeList androidExampleNodes = (NodeList) xPath.evaluate("/documentation/tags/tag[@name='Android']//example", doc, XPathConstants.NODESET); //Evaluate the XPath
...
Analyse unique de XPath Expression plusieurs fois dans un XML
Dans ce cas, vous voulez que l'expression soit compilée avant les évaluations, afin que chaque appel à evaluate
ne compile
pas la même expression. La syntaxe simple serait:
XPath xPath = XPathFactory.newInstance().newXPath(); //Make new XPath
XPathExpression exp = xPath.compile("/documentation/tags/tag[@name='Java']//example");
DocumentBuilder builder = DocumentBuilderFactory.newInstance();
Document doc = builder.parse(new File("path/to/xml.xml")); //Specify XML file path
NodeList javaExampleNodes = (NodeList) exp.evaluate(doc, XPathConstants.NODESET); //Evaluate the XPath from the already-compiled expression
NodeList javaExampleNodes2 = (NodeList) exp.evaluate(doc, XPathConstants.NODESET); //Do it again
Dans l'ensemble, deux appels à XPathExpression.evaluate()
seront beaucoup plus efficaces que deux appels à XPath.evaluate()
.