在 Java 中使用 SAXON Xpath 引擎

Posted

技术标签:

【中文标题】在 Java 中使用 SAXON Xpath 引擎【英文标题】:Using SAXON Xpath engine in Java 【发布时间】:2010-10-29 21:35:40 【问题描述】:

这是我的代码:

public static void main(String[] args) 

    // System.setProperty(
    // "javax.xml.xpath.XPathFactory", 
    // "net.sf.saxon.xpath.XPathFactoryImpl");

    String xml="<root><a>#BBB#</a><a>#CCC#</a><b><a>#DDD#</a></b></root>";
    try
        JDocument dom = new JDocument(xml);

        XPathFactory factory = net.sf.saxon.xpath.XPathFactoryImpl.newInstance();
        XPath xpath = factory.newXPath();
        XPathExpression expr = xpath.compile("//a[matches(.,'#...#')]");

        Object result = expr.evaluate(dom, XPathConstants.NODESET);
        NodeList nodes = (NodeList) result;
        Nodes sharped = new Nodes(nodes);

        for (Node n:sharped)
            System.out.println(n.toString());
        
    
    catch(Exception e)
        e.printStackTrace();
    


我明白了:

javax.xml.transform.TransformerException: Impossible to find the function : matches
at org.apache.xpath.compiler.XPathParser.error(XPathParser.java:608)
at org.apache.xpath.compiler.XPathParser.FunctionCall(XPathParser.java:1505)
at org.apache.xpath.compiler.XPathParser.PrimaryExpr(XPathParser.java:1444)
at org.apache.xpath.compiler.XPathParser.FilterExpr(XPathParser.java:1343)
at org.apache.xpath.compiler.XPathParser.PathExpr(XPathParser.java:1276)

这意味着当我通过net.sf.saxon.xpath.XPathFactoryImpl 明确创建我的工厂时,Java 正在使用org.apache.xpath.compiler.XPathParser 类。

(我实际上只需要在我的 xpaths 中放一些 matches...所以如果知道任何不涉及 Saxon 的解决方案,请考虑满足我的需求)。

我做错了什么?

【问题讨论】:

【参考方案1】:

来自撒克逊人的例子:

System.setProperty("javax.xml.xpath.XPathFactory:"+NamespaceConstant.OBJECT_MODEL_SAXON, "net.sf.saxon.xpath.XPathFactoryImpl");
XPathFactory xpf = XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON);

工作正常。

【讨论】:

如果您对 jar 文件感到困惑,您需要将 saxon core 和 saxon dome 添加到您的依赖项中以使其工作,否则您将得到一个 ""Cannot locate an object model implementation for com.sun.org.apache.xerces.internal.dom.DeferredDocumentImpl 类的节点"异常 我该如何做相反的事情,即强制它使用JVM中默认的XPathFactory(而不是Saxon)? 没有 James,因为我们想在这里使用 XPath 2.0 函数,比如“匹配”。 无论如何,这种解决方法在我的情况下不起作用,没有错误或警告,但在评估任何函数后为空值.. 注意:我使用 docFactory.setNamespaceAware(false);

以上是关于在 Java 中使用 SAXON Xpath 引擎的主要内容,如果未能解决你的问题,请参考以下文章

Saxon 扩展:XdmNode 上的 XPath

Saxon-HE 9.3 的 javax.xml.xpath.XPathFactory 提供程序配置文件中的语法错误

如果 Saxon 在 CLASSPATH 上,则无法识别命名空间的 XPath 表达式失败

将 Xalan 与 Saxon 一起使用

在 node.js 中评估 xpath2.0

支持 XPath 2.0 的 Java XSLT 处理器