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.Node和org.w3c.dom.NodeList
只是澄清2是的我知道Node是一个iterface,getClass()返回一个具体的类.
好吧我明白了!
如果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)
它有效,但仍然,这很奇怪......
| 归档时间: |
|
| 查看次数: |
4903 次 |
| 最近记录: |