我正在尝试使用Saxon运行“不同值” XPath。这是我的代码:

 @Test
public void testAttributeSelect() throws XPathFactoryConfigurationException {
     System.setProperty("javax.xml.xpath.XPathFactory:"
     + NamespaceConstant.OBJECT_MODEL_SAXON,
     "net.sf.saxon.xpath.XPathFactoryImpl");
      System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
    "net.sf.saxon.dom.DocumentBuilderFactoryImpl");
      String xpathString = "distinct-values(//id)";
    DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();

    domFactory.setNamespaceAware(true);

    try {
        DocumentBuilder builder = domFactory.newDocumentBuilder();
        System.out.println(builder.getClass());
        Document doc =
       builder.parse(this.getClass().getResourceAsStream("parametrizedId_feed.xml"));
        System.out.println(doc.getClass());
        XPath xpath =
      XPathFactory.newInstance(NamespaceConstant.OBJECT_MODEL_SAXON).newXPath();

        NodeList s1 = (NodeList)
        xpath.evaluate("/matches", doc, XPathConstants.NODESET);
       NodeList s = (NodeList)
       xpath.evaluate(xpathString, s1 , XPathConstants.NODESET);


我得到这个例外:


  javax.xml.xpath.XPathExpressionException:找不到类net.sf.saxon.dom.DOMNodeList的节点的对象模型实现
      在net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:300)
      在net.sf.saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:434)
      在ca.cbc.panacea.playground.TestXpath.testAttributeSelect(TestXpath.java:43)
      在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
      在sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)


Saxon-dom jar文件位于类路径中。
另外,如果我尝试直接在doc对象上调用“ distinct-values”,则会得到:


  net.sf.saxon.trans.XPathException:扩展功能必需的类org.w3c.dom.NodeList;提供的类net.sf.saxon.value.UntypedAtomicValue的值无法转换
      在net.sf.saxon.dom.DOMObjectModel.convertXPathValueToObject(DOMObjectModel.java:395)
      在net.sf.saxon.dom.DOMObjectModel.access $ 000(DOMObjectModel.java:42)
      在net.sf.saxon.dom.DOMObjectModel $ 5.convert(DOMObjectModel.java:166)
      在net.sf.saxon.xpath.XPathExpressionImpl.evaluate(XPathExpressionImpl.java:352)
      在net.sf.saxon.xpath.XPathEvaluator.evaluate(XPathEvaluator.java:434)


我不知道这是怎么回事。谷歌也没有!

最佳答案

首先要说明的是,DOM和Saxon在一起的情况不是特别好。如果要构造树以便在其上使用Saxon,则优先使用Saxon的本机树模型而不是DOM-它​​快十倍。

您提到saxon-dom.jar的事实意味着您必须使用的Saxon版本比较旧,可能不再支持该版本。因此,我的下一个建议是移至最新版本。

我注意到的另一件事是,您要求XPath处理器与Saxon对象模型一起使用,然后将其用于DOM对象模型。我不知道这是否可行。 (例如,如果您要确保加载Saxon而不是其他XPath引擎,例如因为您需要XPath 2.0,那么最好完全跳过JAXP工厂机制,而直接直接实例化Saxon实现。)

关于java - 撒克逊独特值引发异常,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8045696/

10-11 02:16