JXPath - 对java对象树结构的xpath评估

时间:2015-04-28 10:44:59

标签: java xpath jxpath

我有一个使用java Lists和Maps创建的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 个答案:

答案 0 :(得分:1)

在有人建议直接解决之前,我已经通过这种方式解决了问题:

我为变量" __ root"创建了一个Variables解析器。并将其设置为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/");
}