我正在尝试使用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/