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/");
}