Estoy tratando de hacer una búsqueda xpath en los nodos devueltos por la búsqueda xpath, pero no parece funcionar como esperaba. Los XPaths ejecutados en los nodos secundarios de un documento parecen ejecutarse contra h el nodo raíz del documento (en el ejemplo, la etiqueta de inventario), en lugar de la raíz del nodo proporcionado.Ejecutando XPath en el nodo hijo
¿Falta algo aquí? Soy nuevo en XPath.
Además, no responda "just do // book [author = 'Neal Stephenson'/title". Tengo un caso de uso legítimo, y este es un ejemplo simplificado.
Fragmento de código
DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
domFactory.setNamespaceAware(true);
DocumentBuilder builder = domFactory.newDocumentBuilder();
Document doc = builder.parse("src/main/java/books.xml");
XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
Node book = (Node) xpath.evaluate("//book[author='Neal Stephenson']", doc, XPathConstants.NODE);
Node title = (Node) xpath.evaluate("/title", book, XPathConstants.NODE); // I get null here.
Node inventory = (Node) xpath.evaluate("/inventory", book, XPathConstants.NODE); // this returns a node.
book.xml
<inventory>
<book year="2000">
<title>Snow Crash</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553380958</isbn>
<price>14.95</price>
</book>
<book year="2005">
<title>Burning Tower</title>
<author>Larry Niven</author>
<author>Jerry Pournelle</author>
<publisher>Pocket</publisher>
<isbn>0743416910</isbn>
<price>5.99</price>
</book>
<book year="1995">
<title>Zodiac</title>
<author>Neal Stephenson</author>
<publisher>Spectra</publisher>
<isbn>0553573862</isbn>
<price>7.50</price>
</book>
<!-- more books... -->
</inventory>
Otros han proporcionado buenas respuestas a su pregunta. Tenga en cuenta que '// book' y otras expresiones que comienzan con' // 'pueden afectar el rendimiento, ya que se debe buscar en todo el árbol DOM. '/ inventory/book' es más eficiente. En la misma nota, si una expresión XPath se va a usar varias veces, probablemente debería compilarla una vez con 'XPath.compile()' y ejecutar 'XPathExpression.evaluate()' en el resultado, en lugar de llamar repetidamente 'XPath .evaluate() '. – markusk
Respondido aquí: http://stackoverflow.com/questions/8358994/xpath-search-on-subtree – Benj
Funciona de esta manera no solo en Java. .NET hace lo mismo. – ajeh