【问题标题】:Why does Document object not need to be cast when passing to XPathExpression.evalutate method?为什么 Document 对象在传递给 XPathExpression.evaluate 方法时不需要强制转换?
【发布时间】:2017-05-31 10:09:06
【问题描述】:

我正在清理我的应用程序中的工作代码,我注意到我在代码中的多个位置重用了XPathFactoryXPathXPathExpression 对象,并认为我会清理它设置并设置一个方法来做到这一点。我注意到的是,通常当您将 XML 文档发送到 XPathExpression.evalutate 方法时,您只需将其放在源参数中,就像这样。

DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
Document builder = builderFactory.newDocumentBuilder();
Document document = builder.parse(new FileReader("/path/to/file.xml"));

XPathFactory factory = XPathFactory.newInstance();
XPath xpath = factory.newXPath();
XPathExpression expression = xpath.compile("path/to/node");
Object result = expression.evaluate(document, XPathConstants.NODE);

这很好,但是当我尝试将 XPath 部分包装到这样的单独方法中时:

private Object getObjectByExpression(String expr, InputSource source, QName objectType)
{
    XPathFactory factory = XPathFactory.newInstance();
    XPath xpath = factory.newXPath();
    XPathExpression expression = xpath.compile(expr);
    Object result = expression.evaluate(document, objectType);
    return result;
}

public void someCalledMethod()
{
    DocumentBuilderFactory builderFactory = DocumentBuilderFactory.newInstance();
    Document builder = builderFactory.newDocumentBuilder();
    Document document = builder.parse(new FileReader("/path/to/file.xml"));

    Object result = getObjectByExpression("/path/to/node", document, XPathConstants.NODE);
}

Eclipse 告诉我必须将 document 转换为 InputSource 并将其标记为错误。我确实仔细检查了 XPathExpression.evaluate 中使用的 InputSource 和我的方法中的类类型是否相同。有没有人对这种不一致的来源有更深入的了解?

【问题讨论】:

    标签: java xpath parameter-passing


    【解决方案1】:

    实际上,Document 使用的是XPathExpression.evaluate(Object, QName) 方法。

    Document 是一个接口,所以它不能继承类InputSource。这不可能。这就是为什么你需要更新你的方法:

    private Object getObjectByExpression(String expr, Object source, QName objectType)
    

    或者如果你真的想把它限制在Document

    private Object getObjectByExpression(String expr, Document source, QName objectType)
    

    【讨论】:

    • 感谢@AxelH,我显然是盲人,没有看到有多个方法签名。我现在觉得有点傻。
    • @JRSofty 使用eclipse,可以使用+左键点击方法打开类中的声明。快速检查方法很有用,或者您只需将鼠标悬停在方法上检查 javadoc,它会识别出它是 Object 方法,而不是 InputSource ;) 我不知道其他 IDE 上的快捷方式
    • @JRSofty 如果答案正在解决您的问题,请毫不犹豫地将其标记为已接受。或者随时等待其他人;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-07
    • 2021-03-19
    • 1970-01-01
    • 1970-01-01
    • 2011-02-10
    • 1970-01-01
    相关资源
    最近更新 更多