为什么要编译XPath表达式?

时间:2013-04-12 11:20:44

标签: java xml xpath

我有以下两个代码段执行相同的操作,除了一个是编译表达式而另一个只是评估它。

    //1st option - compile and run

    //make the XPath object compile the XPath expression
    XPathExpression expr = xpath.compile("/inventory/book[3]/preceding-sibling::book[1]");
    //evaluate the XPath expression
    Object result = expr.evaluate(doc, XPathConstants.NODESET);
    nodes = (NodeList) result;
    //print the output
    System.out.println("1st option:");
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("i: " + i);
        System.out.println("*******");
        System.out.println(nodeToString(nodes.item(i)));
        System.out.println("*******");
    }


    //2nd option - evaluate an XPath expression without compiling

    Object result2 = xpath.evaluate("/inventory/book[3]/preceding-sibling::book[1]",doc,XPathConstants.NODESET);
    System.out.println("2nd option:");
    nodes = (NodeList) result2;
    //print the output
    for (int i = 0; i < nodes.getLength(); i++) {
        System.out.println("i: " + i);
        System.out.println("*******");
        System.out.println(nodeToString(nodes.item(i)));
        System.out.println("*******");
    }

输出完全相同。 编译和评估有什么区别?为什么我要编译/不编译表达式?

3 个答案:

答案 0 :(得分:5)

编译XPath表达式会将其保存为可立即使用的格式。在评估表达式时也会编译,但之后会丢弃编译结果。

当反复使用相同的表达式时,建议进行编译,例如在循环中。

答案 1 :(得分:1)

第二个evaluate也隐式编译表达式,但在评估后立即抛弃编译后的表单。在您的示例中,这没有任何区别,因为您只使用表达式一次。

但是如果你不止一次地使用表达式,那么编译一次并多次重复使用编译后的表单与每次重新编译它相比可以节省大量的处理时间。

答案 2 :(得分:0)

编译xpath需要时间。 xpath.evaluate每次调用时都会编译xpath。使用预编译表达式可提高性能。