xpath поиск по поддереву - PullRequest
13 голосов
/ 02 декабря 2011

Мне нужно ограничить поиск узла xpath поддеревом. В настоящее время я использую описанный ниже метод, но он выполняет поиск по всему документу, независимо от того, передам ли я ему документ или узел, из которого я хочу выполнить поиск.

private NodeList findNodes(Object obj,String xPathString) throws ... {
    XPath xPath = XPathFactory.newInstance().newXPath();
    XPathExpression expression = xPath.compile(xPathString);
    return (NodeList) expression.evaluate(obj, XPathConstants.NODESET);
}

Решение, которое я использую сейчас, заключается в том, что я создаю новый документ, добавляю узел и выполняю поиск в новом документе, а затем объединяюсь. Я хочу улучшить это. Можно ли это сделать?

Используемый мной XPath: //nodeName.

Ответы [ 3 ]

16 голосов
/ 02 декабря 2011

Вы смотрите на оси //, что означает «любой узел-потомок корня документа»,

Измените его на ось .// (потомки узла контекста), и он будет работать как положено.

8 голосов
/ 03 декабря 2011

Необходимо различать абсолютное и относительное выражение XPath .

Хороший вопрос + 1.

В XPath любое выражение, начинающееся с /, представляет собой абсолютное выражение XPath . Абсолютное выражение XPath оценивается в полном текущем документе .

В отличие от этого относительное выражение XPath вычисляется вне текущего (контекстного) узла.

Это объясняет сообщаемую проблему : //nodeName является абсолютным выражением XPath.

Требуется относительное выражение XPath , например:

.//nodeName
2 голосов
/ 02 декабря 2011

.//nodeName будет искать элемент nodeName в любом месте данного узла контекста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...