在java中查询xml的最快方法

时间:2013-06-22 11:32:30

标签: java xml dom xml-parsing

在java中查询巨大的XML文件的最快方法是什么,

DOM - xpath:这需要很多时间,

     DocumentBuilderFactory docBuilderFactory = DocumentBuilderFactory.newInstance();
     docBuilderFactory.setNamespaceAware(true);

     DocumentBuilder docBuilder = docBuilderFactory.newDocumentBuilder();
     Document document = docBuilder.parse(new File("test.xml"));

     XPath xpath = XPathFactory.newInstance().newXPath();

     String xPath = "/*/*[@id='ABCD']/*/*";

     XPathExpression expr = xpath.compile(xPath);
     //this line takes lot of time
     NodeList result = (NodeList)expr.evaluate(document, XPathConstants.NODESET);

代码中的最后一行,程序在40秒内完成,在1秒内完成。

SAX:我不知道这是否可以用于查询,在互联网上我只能找到解析的例子。

使查询更快的其他选项有哪些,我的xml文件大小约为5MB。日Thnx

5 个答案:

答案 0 :(得分:3)

如果您的id属性属于xs:ID类型且您的文档具有XML架构,则可以使用Document.getElementById(String)方法。我将在下面举例说明。

XML架构

<?xml version="1.0" encoding="UTF-8"?>
<schema 
    xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="http://www.example.org/schema" 
    xmlns:tns="http://www.example.org/schema" 
    elementFormDefault="qualified">

    <element name="foo">
        <complexType>
            <sequence>
                <element ref="tns:bar" maxOccurs="unbounded"/>
            </sequence>
        </complexType>
    </element>

    <element name="bar">
        <complexType>
            <attribute name="id" type="ID"/>
        </complexType>
    </element>

</schema>

XML输入(input.xml)

<?xml version="1.0" encoding="UTF-8"?>
<foo xmlns="http://www.example.org/schema">
    <bar id="ABCD"/>
    <bar id="EFGH"/>
    <bar id="IJK"/>
</foo>

<强>演示

您需要在Schema上设置DocumentBuilderFactory的实例才能让一切正常运作。

import java.io.File;
import javax.xml.XMLConstants;
import javax.xml.parsers.*;
import javax.xml.validation.*;
import org.w3c.dom.*;

public class Demo {

    public static void main(String[] args) throws Exception {
        SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI);
        Schema schema = sf.newSchema(new File("src/forum17250259/schema.xsd"));

        DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
        dbf.setNamespaceAware(true);
        dbf.setSchema(schema);
        DocumentBuilder db = dbf.newDocumentBuilder();
        Document document = db.parse(new File("src/forum17250259/input.xml"));

        Element result = document.getElementById("EFGH");
        System.out.println(result);
    }

}

答案 1 :(得分:1)

查看SAX api,因为它是目前可用于处理XML文档的最快且内存最少的机制

答案 2 :(得分:1)

这取决于您要执行的查询类型。

例如,如果你只是想通过ID找到一个节点,然后读出它的文本内容,那么SAX将会非常快,但它需要一些编码来编写一个SAX处理程序(可能从{{3}扩展) })。

另一方面,如果你想要执行一个相当复杂的查询,那就是“获取foo的第三个祖先节点,其中foo有一个孩子bah”,你几乎必须使用xpath作为SAX处理程序非常复杂。

答案 3 :(得分:1)

Jdk的默认XPath引擎因其性能缓慢而臭名昭着。你应该考虑Jaxen或vtd-xml。请参阅以下rticles ....

http://fahdshariff.blogspot.com/2010/08/faster-xpaths-with-vtd-xml.html

答案 4 :(得分:-2)

尝试一下Jackson lib,它是最快的xml / json p之一