如何在Java中使用Saxon XPath 2.0?

Ste*_*ris 3 java xpath saxon

我喜欢在xPath中使用正则表达式,所以我安装了Saxon9.6

  1. 我的$ {java.home}是C:\ Program Files\Java\jdk1.7.0_51.
  2. 我在C:\ Program Files\Java\jdk1.7.0_51\jre\lib\ext中提取了saxonHE9-6-0-6J.zip
  3. 并将saxonhe9.jar添加到我的classpath变量中.
  4. 然后我在C:\ Program Files\Java\jdk1.7.0_51\jre\lib下创建了一个jaxp.properties文件并添加以下行:

    javax.xml.transform.TransformerFactory = net.sf.saxon.TransformerFactoryImpl javax.xml.xpath.XPathFactory","net.sf.saxon.xpath.XPathFactoryImpl

但是现在我找不到像这个页面上描述的那样的例子.

Mic*_*Kay 8

在Saxon的最新版本中,JAR文件不再包含将其作为JAXP XPath工厂提供程序广告的meta-inf服务文件.这是因为太多的应用程序遇到了问题:如果应用程序是经过编写和测试的,可以使用JDK附带的XPath 1.0引擎,那么如果你尝试使用Saxon的XPath 2.0引擎运行它,它很有可能会失败,这种情况的发生仅仅是撒克逊人在阶级路径上的结果.因此,如果您想使用Saxon作为XPath引擎,则现在必须明确请求,例如net.sf.saxon.xpath.XPathFactoryImpl直接实例化.

我的意思是呼唤new XPathFactoryImpl()而不是XPathFactoryImpl.newInstance()因为它是继承而来的XPathFactory.

但是,因为XPath 2.0类型系统比XPath 1.0更丰富,所以JAXP接口非常笨拙,我建议使用s9api接口.


小智 6

我像这样使用 Saxon-HE 9.8.0-5:

Processor processor = new Processor(false);
XdmNode xdm = processor.newDocumentBuilder().build(new StreamSource(new StringReader(xml)));
XdmValue result = processor.newXPathCompiler().evaluate(query, xdm);

StringBuilder sb = new StringBuilder();
for (int i = 0; i < result.size(); i++) {
    sb.append(result.itemAt(i).getStringValue());
    if (i + 1 != result.size()) {
        sb.append('\n');
    }
}
Run Code Online (Sandbox Code Playgroud)