Я пытаюсь сделать xpath поиск на узлах, возвращенных xpath поиском, но это, кажется, не работает, как я ожидал. XPaths, выполняемые на дочерних узлах документа, кажется, executd против hthe корневого узла документа (в примере, теге материально-технических ресурсов.), вместо корня обеспеченного узла.
Я пропускаю что-то здесь? Я плохо знаком с XPath.
Кроме того, не отвечайте, "просто делают//книга [автор =' 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 дает немного больше информации.
Просто уберите косую черту в своих подзапросах, и все будет в порядке. Итак, вы получаете свои книги через «// book»
, а затем оттуда просто «title»
, «inventory»
и т. Д., Чтобы получить дочерние биты.