JXPath - оценка xpath для древовидной структуры объектов Java

У меня есть древовидная структура (модель) объектов Java, созданная с использованием Java-списков и карт, и я хочу оценить xpath следующего вида:

name[/type='theType']

Это выражение xpath нуждается как в узле контекста, так и в корневом узле. Однако я не нашел способа передать оба узла в JXPath для оценки. Я пробовал несколько вариантов следующего кода (попытался обменять root и context, null вместо rootContext и т. Д.):

JXPathContext rootContext = JXPathContext.newContext(rootNode);
JXPathContext contextContext = JXPathContext.newContext(rootContext, contextNode);
Pointer p = contextContext.getPointer(xpath);
return p.getNode();

но никто не работал. В отличие от модели XML DOM, в контейнерах у вас нет прямого доступа от контекстного узла к корневому узлу.

Не могли бы вы дать совет, как это сделать?

1 ответ

Решение

Пока кто-то не предложит прямое решение, я решил проблему следующим образом:

Я создал преобразователь переменных для переменной "__root" и установил его в контекст jxpath, например так:

xpathContext.setVariables(new JXPathVariablesResolver(...));

Затем я нахожу все корневые ссылки в xpath и заменяю их на "$__root/":

String xpFixed = fixAbsoluteXPaths(xp);
Pointer p = xpathContext.getPointer(xpFixed);

Вот используемая функция:

public static final Pattern reAbsInnerXPath = Pattern.compile(
        "(^|[\\(\\[\\|,])\\s*/"); //TODO: avoid matches inside strings

protected String fixAbsoluteXPaths(String xpath) {
    Matcher m = reAbsInnerXPath.matcher(xpath);
    return m.replaceAll("$1\\$__root/");
}
Другие вопросы по тегам