Saxon XPath API返回TinyElementImpl而不是org.w3c.dom.Node

Era*_*dan 7 java saxon xpath-api java-api

我有以下代码:

// xpath evaluates to net.sf.saxon.xpath.XPathEvaluator
XPath xpath = XPathFactory.newInstance().newXPath(); 
XPathExpression expression = xpath.compile("/foo/bar");
Object evaluate = expression.evaluate(someXML, XPathConstants.NODE);
Object evaluate2 = expression.evaluate(someXML, XPathConstants.NODESET);

System.out.println(evaluate!=null?evaluate.getClass():"null");
System.out.println(evaluate2!=null?evaluate2.getClass():"null2");

System.out.println(evaluate instanceof Node);
System.out.println(evaluate2 instanceof NodeList);
Run Code Online (Sandbox Code Playgroud)

这就是结果......

class net.sf.saxon.tinytree.TinyElementImpl
class java.util.ArrayList
false
false

只是为了澄清,如果我这样做:

org.w3c.dom.Node node = (org.w3c.dom.Node)evaluate;
Run Code Online (Sandbox Code Playgroud)

要么

org.w3c.dom.NodeList node = (org.w3c.dom.NodeList)evaluate2;
Run Code Online (Sandbox Code Playgroud)

我得到了 ClassCastException

怎么可能?根据Suns Java 1.5 API NODE和NODESET应分别映射到org.w3c.dom.Nodeorg.w3c.dom.NodeList

只是澄清2是的我知道Node是一个iterface,getClass()返回一个具体的类.

Era*_*dan 6

好吧我明白了!

如果evaluate方法收到InputSource,则会发生上述错误.

例如

InputSource someXML = new InputSource(new StringReader("<someXML>...</someXML>)");
Object result = expression.evaluate(someXML, XPathConstants.NODE); 
Node node = (Node) result; // ClassCastException
Run Code Online (Sandbox Code Playgroud)

然后结果没有实现org.w3c.dom.Node(TinyElementImpl)

但如果评估收到Node(或a Document):

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder documentBuilder = builderFactory.newDocumentBuilder();
Document someXML = documentBuilder.parse(new InputSource(new StringReader("<someXML>...</someXML>)"));
Object result = expression.evaluate(someXML, XPathConstants.NODE);
Node node = (Node) result; // works
Run Code Online (Sandbox Code Playgroud)

它有效,但仍然,这很奇怪......

  • 欢迎使用Java XML. (2认同)