比javax.xml.xpath更快的api来解析xml的值?

Noh*_*sib 6 java xml

javax.xml.xpath用来搜索xml文件中的特定字符串,但由于需要搜索大量的xml文件,这比预期慢得多.

java支持的api是否比javax.xml.xpath可用的速度更快或哪个最快?

bdo*_*han 10

正如skaffman所指出的,您需要确保javax.xml.xpath尽可能高效地使用库.如果您要执行XPath语句,一旦您想要确保将其编译为XPathExpression.

XPathExpression xPathExpression = xPath.compile("/root/device/modelname");
nl = (NodeList) xPathExpression.evaluate(dDoc, XPathConstants.NODESET);
Run Code Online (Sandbox Code Playgroud)

演示

在示例中,选项#2将比选项#1更快.

import java.io.File;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.xpath.XPath;
import javax.xml.xpath.XPathConstants;
import javax.xml.xpath.XPathExpression;
import javax.xml.xpath.XPathFactory;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;

public class Demo {

    public static void main(String[] args) {
        DocumentBuilderFactory domFactory = DocumentBuilderFactory.newInstance();
        try {
            DocumentBuilder builder = domFactory.newDocumentBuilder();
            File xml = new File("input.xml");
            Document dDoc = builder.parse(xml);

            NodeList nl;

            // OPTION #1
            XPath xPath = XPathFactory.newInstance().newXPath();
            nl = (NodeList) xPath.evaluate("root/device/modelname", dDoc, XPathConstants.NODESET);
            printResults(nl);
            nl = (NodeList) xPath.evaluate("/root/device/modelname", dDoc, XPathConstants.NODESET);
            printResults(nl);

            // OPTION #2
            XPathExpression xPathExpression = xPath.compile("/root/device/modelname");
            nl = (NodeList) xPathExpression.evaluate(dDoc, XPathConstants.NODESET);
            printResults(nl);
            nl = (NodeList) xPathExpression.evaluate(dDoc, XPathConstants.NODESET);
            printResults(nl);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private static void printResults(NodeList nl) {
        for(int x=0; x<nl.getLength(); x++) {
            System.out.println("the value is: " + nl.item(x).getTextContent());
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

input.xml中

<?xml version="1.0" encoding="UTF-8"?>
<root>
  <blah>foo</blah>
  <device>
    <modelname>xbox</modelname>
  </device>
  <blah>bar</blah>
  <device>
    <modelname>wii</modelname>
  </device>
  <blah/>
</root>
Run Code Online (Sandbox Code Playgroud)