xerces Xpath - поиск узла с другого узла

У меня есть следующий XML:

    <ONIXMessage>
        <Product>
            <RecordReference>9786071502131</RecordReference>
            <RecordReference>9786071502131</RecordReference>
        </Product>
        <Product>
            <RecordReference>9786071502131</RecordReference>
        </Product>
    </ONIXMessage>

И следующий код Java:

    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()); 
    }   

Этот код возвращает: 3 3 3 3

Я думаю, что этот код должен возвращать 3 2 3 1, потому что переменная prova содержит все узлы RecordReference документа, а prova2 содержит только конкретные узлы RecordReference только одного узла продукта.

Как я могу использовать XPATH, чтобы получить только узлы определенного продукта?

1 ответ

Первый параметр для XPathAPI#selectNodeList является контекстом для выражения XPath.

Проходя product переменная является разумной и правильной, но ваш запрос XPath неверен: косая черта / в начале выражения обозначает корневой узел текущего контекста, который в данном случае является <ONIXMessage/> элемент.

Вместо этого начните с текущего контекста, который представлен точкой ., Помните, что ваше новое выражение начинается в этом контексте, поэтому ваш новый XPath будет ./RecordReference, Вы могли бы даже опустить ./, но я предпочитаю добавлять эти два символа, облегчая чтение и понимание запроса:

NodeList prova2 = XPathAPI.selectNodeList(product, "./RecordReference");
Другие вопросы по тегам