我試圖對由xpath查找返回的節點執行xpath查找,但它似乎沒有像我期望的那樣工作。在文檔的子節點上執行的XPath似乎被執行h文檔的根節點(在本例中爲庫存標籤),而不是所提供節點的根節點。在子節點上運行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>
其他人已經爲您的問題提供了很好的答案。請注意,'// book'和其他以'//開頭的表達式可能會影響性能,因爲必須搜索整個DOM樹。 '/ inventory/book'更有效率。同樣,如果一個XPath表達式被多次使用,你應該用'XPath.compile()'編譯一次,然後在結果上運行'XPathExpression.evaluate()',而不是重複調用'XPath評估()'。 – markusk 2010-04-11 20:38:35
在這裏回答:http://stackoverflow.com/questions/8358994/xpath-search-on-subtree – Benj 2013-05-09 14:45:38
它不僅在Java中這樣工作。 .NET做同樣的事情。 – ajeh 2016-09-28 17:01:48