Java Language
XML XPath Evaluation
Ricerca…
Osservazioni
Le espressioni XPath vengono utilizzate per navigare e selezionare uno o più nodi all'interno di un documento ad albero XML, ad esempio selezionando un determinato elemento o nodo di attributo.
Vedi questa raccomandazione del W3C per un riferimento su questa lingua.
Valutazione di un NodeList in un documento XML
Dato il seguente documento XML:
<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>
Quanto segue recupera tutti i nodi di example
per il tag Java (Utilizzare questo metodo se si valuta XPath solo in XML una volta. Vedere altro esempio per quando più chiamate XPath vengono valutate nello stesso file 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
...
Analisi di più espressioni XPath in un singolo XML
Utilizzando lo stesso esempio di Evaluating a NodeList in un documento XML , ecco come si renderebbero più chiamate XPath in modo efficiente:
Dato il seguente documento XML:
<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>
Ecco come useresti XPath per valutare più espressioni in un documento:
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
...
Analisi di singoli XPath Expression più volte in un XML
In questo caso, si desidera che l'espressione sia compilata prima delle valutazioni, in modo che ogni chiamata da evaluate
non compile
la stessa espressione. La semplice sintassi sarebbe:
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
Complessivamente, due chiamate a XPathExpression.evaluate()
saranno molto più efficienti di due chiamate a XPath.evaluate()
.