xerces Xpath - search node from another node

924 views Asked by At

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?

1

There are 1 answers

0
Jens Erat On

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:

NodeList prova2 = XPathAPI.selectNodeList(product, "./RecordReference");