I have the follows XML:
<ONIXMessage>
<Product>
<RecordReference>9786071502131</RecordReference>
<RecordReference>9786071502131</RecordReference>
</Product>
<Product>
<RecordReference>9786071502131</RecordReference>
</Product>
</ONIXMessage>
And the follows java code:
Element ONIXmessage = document.getDocumentElement();
products = XPathAPI.selectNodeList(ONIXmessage, "/ONIXMessage/Product");
for(int i = 0;i < products.getLength();i++) {
Node product = products.item(i);
NodeList prova = XPathAPI.selectNodeList(ONIXmessage, "/ONIXMessage/Product/RecordReference");
System.out.println(prova.getLength());
NodeList prova2 = XPathAPI.selectNodeList(product, "/ONIXMessage/Product/RecordReference");
System.out.println(prova2.getLength());
}
This code returns: 3 3 3 3
I think this code should return 3 2 3 1 because the "prova" variable contains all "RecordReference" nodes of the document, and "prova2" only contains the specific "RecordReference" nodes of only one product node.
How I can use XPATH to get only the nodes of a particular product?
The first parameter to
XPathAPI#selectNodeList
is the context for the XPath expression.Passing the
product
variable is reasonable and correct, but your XPath query is wrong: a slash/
in the beginning of an expression denominates the root node of the current context, which in this case is the<ONIXMessage/>
element.Instead, start at the current context which is represented by the dot
.
. Remember your new expression is starting at this context, so your new XPath would be./RecordReference
. You could even ommit the./
, but I prefer adding these two characters making the query easier to read and understand: