在子节点上运行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基于当前节点。
在Xpath中,“。” (点)代表当前文件。 所以,写一个“。”后面的XPATHstring。 (点)。
例如:
"./title"
要么
".//title"
任何你想要的….
只有在节点的子节点上才删除斜杠。 如果要使用//(当前文档中的任何位置)function,该怎么办?
所以,使用点(。)
也非常感谢以上的答案:)。
只要从你的子查询中引导斜杠,你应该没问题。 所以你通过"//book"
得到你的书,然后从那里只是"title"
, "inventory"
等得到孩子的位。
Java实现中真正奇怪的是,从文档中提取的节点仍然引用父文档(请参阅Node.getOwnerDocument()
),xpath使用它来查找根文档。
其他人提到了一种修改xpath的方法,通过删除斜杠实际上不能从根启动。
我有一个类似的问题,但我希望xpath处理根文档和子节点(像xpath一样/title
)。 解决scheme是克隆节点: Node.cloneNode(true)
。 请注意使Nodeclosures其父文档的true
参数。
…最后,太多伤害了性能,并有单独的xpath来处理节点和文档是首选。