Java Language
Evaluación XML XPath
Buscar..
Observaciones
Las expresiones XPath se utilizan para navegar y seleccionar uno o más nodos dentro de un documento del árbol XML, como seleccionar un elemento o atributo determinado.
Consulte esta recomendación del W3C para obtener una referencia en este idioma.
Evaluando un NodeList en un documento XML
Dado el siguiente 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>
Lo siguiente recupera todos los nodos de example
para la etiqueta de Java (use este método si solo evalúa XPath en el XML una vez. Vea otro ejemplo para cuando se evalúan múltiples llamadas de XPath en el mismo archivo 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
...
Analizar múltiples expresiones XPath en un solo XML
Usando el mismo ejemplo que Evaluating a NodeList en un documento XML , aquí es cómo podría hacer múltiples llamadas XPath de manera eficiente:
Dado el siguiente 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>
Así es como usaría XPath para evaluar múltiples expresiones en 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
...
Analizar una sola expresión XPath varias veces en un XML
En este caso, desea tener la expresión compilada antes de las evaluaciones, para que cada llamada a evaluate
no compile
la misma expresión. La sintaxis simple sería:
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
En general, dos llamadas a XPathExpression.evaluate()
serán mucho más eficientes que dos llamadas a XPath.evaluate()
.