当前位置: 首页 > 面试题库 >

在Java中使用SAXON Xpath引擎

戚俊美
2023-03-14
问题内容

这是我的代码:

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)

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

(实际上,我只需要matches在xpaths中放置一些…因此,如果知道不涉及Saxon的任何解决方案,请考虑达到了我的需要)。

我究竟做错了什么 ?


问题答案:

从撒克逊人的例子:

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

工作良好。



 类似资料:
  • 问题内容: 我正在编写此Java程序,以使用Eratosthenes的Sieve查找到num为止的所有素数,但是当我尝试编译时,它说我不能将long var用作数组索引,并且期望int var in它的位置。但是我将使用大量数据,因此不能使用int。我能做什么? 问题答案: 我不确定为什么您的代码会首先开始编译。 您不应该在数组列表中使用[]访问成员。arraylist只是内部存储在数组中的列表。

  • 我必须把一个项目从Java8转移到Java17。 我可以解决大多数问题,但它包含一种方法,我使用ScriptEngineManager来计算一个数学术语。 在Java8中,它可以根据需要工作,但在Java17中始终为空。 根据谷歌的说法,Java17不再支持JavaScript引擎。 由于项目限制,我不允许使用第三方库。 在Java17中有没有合适的方法来处理这个问题?

  • 本文向大家介绍如何使用Java在MongoDB中创建索引?,包括了如何使用Java在MongoDB中创建索引?的使用技巧和注意事项,需要的朋友参考一下 在MongoDB中创建索引,您需要使用createIndex()方法。 语法 其中的键是要在其上创建索引的文件的名称,而1是升序。要以降序创建索引,您需要使用-1。 在Java中,您可以使用 createIndex()方法创建索引,该方法需要传递索

  • 本文向大家介绍如何使用Java在MongoDB中删除索引?,包括了如何使用Java在MongoDB中删除索引?的使用技巧和注意事项,需要的朋友参考一下 在MongoDB中删除索引,您需要使用dropIndex()方法。 语法 在Java中,可以使用dropIndex()方法删除索引,您需要将索引的类型(升序或降序)和在其上创建字段的名称传递给该方法。 示例 输出结果

  • 问题内容: 我有一些要用Java中的SAX解析器解析的XML。它从以下序言开始: 如何将其更改为使用本地DTD? 我想我可以做这样的事情: 不完全是这样,但 事情 那样。但是,我需要独立于用户系统的路径。 如何将本地DTD与相对于类路径的路径一起使用? 问题答案: 看看这篇文章上使用XML目录来解决本地的DTD,而不必修改您的XML源。基本步骤是: 创建一个将系统ID映射到本地DTD的XML文件

  • 我一直在看Neo4J和Neo4J的客户。。 neo4jclient wiki帮助我处理节点crud操作。。然而,维基突然就此结束。。我翻遍了源代码中的测试方法,设法了解了关系,并在网上搜索以了解索引是如何工作的。 到目前为止,我大致了解到: 这就是我现在被困的地方。。当我尝试按名称查找用户时,密码查询返回的结果为零: 我不太明白为什么它在清晰的时候返回零节点 显示所有节点。 索引时我还遗漏了什么吗