在子节点上运行XPath

2021/01/17 09:41 · java ·  · 0评论

我正在尝试在xpath查找返回的节点上执行xpath查找,但它似乎没有按预期工作。在文档的子节点上执行的XPath似乎是针对文档的根节点执行的(在例如清单标签),而不是所提供节点的根。

我在这里想念什么吗?我是XPath的新手。

另外,请不要回答“只是// book [author ='Neal Stephenson'/ title”。我有一个合法的用例,这是一个简化的示例。

程式码片段

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将基于根节点进行选择,而忽略您要针对其评估xpath的上下文。foo(不带斜线)是您想要的;根据当前节点进行选择。

https://www.w3schools.com/xml/xpath_syntax.asp提供了更多信息。

在Xpath中,“。” (点)代表当前文档。因此,在“。”之后写XPATH字符串。(点)。

例如:

"./title"

要么

".//title"

任何你想要的....

仅当斜杠为节点的子级时,删除斜杠才有效。如果要使用//(在当前文档中的任何位置)功能怎么办?

因此,请使用点(。)

也非常感谢上述回答:)。

只需从子查询中删除前导斜线,就可以了。所以,你得到通过你的书"//book",然后从那里它只是"title""inventory"等,以获得孩子的位。

在Java实现中,实际上很奇怪的是,从Document中提取的Node仍然引用父Document(请参阅参考资料Node.getOwnerDocument()),而xpath使用它来查找根。

其他人提到了一种通过删除斜杠将xpath修改为实际上不是从根开始的方法。

我遇到了类似的问题,但我希望xpath可以处理根文档和子节点(带有xpath之类的/title)。解决方案是克隆节点:Node.cloneNode(true)注意true使Node摆脱其父Document参数。

……最后,它极大地损害了性能,因此首选使用单独的xpath来处理Node和Document。

本文地址:http://java.askforanswer.com/zaizijiedianshangyunxingxpath.html
文章标签: ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!