在子节点上运行XPath

我正在尝试对xpath查找返回的节点执行xpath查找,但似乎并不像我期望的那样工作。在文档的子节点上执行的XPath似乎是针对文档的根节点执行的例如库存标签),而不是提供的节点的根。

我在这里错过了什么? 我是XPath的新手。

此外,请不要回答“只要做/ /书[作者='尼尔斯蒂芬森'/标题”。 我有一个合法的用例,这是一个简单的例子。

代码片段

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> 

/foo将根据根节点进行select,忽略您正在评估xpath的上下文。 foo (没有斜线)是你想要的; 该select基于当前节点。

https://www.w3schools.com/xml/xpath_syntax.asp提供了一些信息。;

在Xpath中,“。” (点)代表当前文件。 所以,写一个“。”后面的XPATHstring。 (点)。

例如:

 "./title" 

要么

 ".//title" 

任何你想要的….

只有在节点的子节点上才删除斜杠。 如果要使用//(当前文档中的任何位置)function,该怎么办?

所以,使用点(。)

也非常感谢以上的答案:)。

只要从你的子查询中引导斜杠,你应该没问题。 所以你通过"//book"得到你的书,然后从那里只是"title""inventory"等得到孩子的位。

Java实现中真正奇怪的是,从文档中提取的节点仍然引用父文档(请参阅Node.getOwnerDocument() ),xpath使用它来查找根文档。

其他人提到了一种修改xpath的方法,通过删除斜杠实际上不能从根启动。

我有一个类似的问题,但我希望xpath处理根文档和子节点(像xpath一样/title )。 解决scheme是克隆节点: Node.cloneNode(true) 。 请注意使Nodeclosures其父文档的true参数。

…最后,太多伤害了性能,并有单独的xpath来处理节点和文档是首选。