3

我有以下两个代码段,它们做同样的事情,除了一个正在编译表达式,一个只是评估它。

    //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("*******");
    }

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

4

3 回答 3

6

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

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

于 2013-04-12T11:25:40.920 回答
1

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

但是,如果您多次使用该表达式,则编译一次并多次重新使用已编译的表单与每次重新编译相比可以节省大量的处理时间。

于 2013-04-12T11:26:32.410 回答
0

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

于 2013-04-12T11:23:30.790 回答