2015-04-28 9 views
0

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

name[/type='theType'] 

Это Для выражения xpath нужен как контекстный узел, так и корневой узел. Тем не менее, я не нашел способа передать оба узла в JXPath для оценки. Я попробовал несколько вариантов следующего кода (попытался обменной корень и контекст, нуль вместо 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 и заменить их «$ корень __ /»:

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