5

在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。谢谢

4

5 回答 5

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>

演示

您将需要设置Schemaon 的实例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);
    }

}
于 2013-06-25T10:46:58.893 回答
1

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

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

于 2013-07-18T19:39:51.267 回答
1

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

于 2013-06-22T11:37:01.790 回答
1

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

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

另一方面,如果您想按照“获取 foo 的第三个祖先节点,其中 foo 有一个孩子 bah”这一行执行相当复杂的查询,您几乎将不得不使用 xpath 作为 SAX 处理程序复杂到不可能。

于 2013-06-22T12:09:55.273 回答
-2

试试 Jackson 库,它是 xml/json p 的禁食之一

于 2013-06-22T11:48:06.373 回答