Java Language
XML XPath-evaluatie
Zoeken…
Opmerkingen
XPath-expressies worden gebruikt om te navigeren en een of meer knooppunten in een XML-boomstructuurdocument te selecteren, zoals het selecteren van een bepaald element of kenmerkknooppunt.
Zie deze W3C-aanbeveling voor een referentie over deze taal.
Een NodeList evalueren in een XML-document
Gegeven het volgende XML-document:
<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>
Het volgende haalt alle example
voor de Java-tag (gebruik deze methode als u XPath slechts eenmaal in de XML evalueert. Zie een ander voorbeeld voor wanneer meerdere XPath-aanroepen in hetzelfde XML-bestand worden geëvalueerd.):
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
...
Meerdere XPath-expressies in één XML parseren
Met hetzelfde voorbeeld als Evalueren van een NodeList in een XML-document , kunt u als volgt meerdere XPath-oproepen efficiënt uitvoeren:
Gegeven het volgende XML-document:
<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>
Dit is hoe je XPath zou gebruiken om meerdere uitdrukkingen in één document te evalueren:
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
...
Enkele XPath-expressie meerdere keren parseren in een XML
In dit geval wilt u dat de uitdrukking vóór de evaluaties wordt gecompileerd, zodat elke aanroep om te evaluate
niet dezelfde uitdrukking compile
. De eenvoudige syntaxis zou zijn:
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
Over het algemeen zijn twee aanroepen naar XPathExpression.evaluate()
veel efficiënter dan twee aanroepen naar XPath.evaluate()
.