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

JXPath - xpath evaluation on a java objects tree structure

我有一个使用 java 列表和映射创建的 java 对象树结构(模型),我想评估以下类型的 xpath:

name[/type='theType']

此 xpath 表达式需要上下文节点和根节点。但是,我找不到如何将两个节点传递给 JXPath 进行评估的方法。 我尝试了以下代码的几种变体(尝试交换根和上下文,null 而不是 rootContext 等):

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

但 none 有效。与 XML DOM 模型相比,在容器中,您无法从上下文节点直接访问根节点。

对于如何做到这一点,您有什么建议吗?

在有人提出直接解决方案之前,我是这样解决问题的:

我为变量“__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("\$__root/");
}