jxpath—对java对象树结构的xpath求值

4c8rllxm  于 2021-07-13  发布在  Java
关注(0)|答案(1)|浏览(361)

我有一个使用java列表和Map创建的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();

但都没用。与xmldom模型不同的是,在容器中,您无法从上下文节点直接访问根节点。
你对怎么做有什么建议吗?

au9on6nz

au9on6nz1#

在有人提出直接解决方案之前,我是这样解决问题的:
我为变量“\uu root”创建了一个变量解析器,并将其设置为jxpath上下文,如下所示:

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

然后我在xpath中找到所有根引用,并用“$\u 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/");
}

相关问题