2013-06-22 59 views
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左右。日Thnx

+0

您是否试过StAX或JAXB? – davek

+0

最快(如重复验证)是vtd-xml(http://vtd-xml.sf.net) –

回答

1

看一看SAX api,因为它是最快和最内存密集型机制,目前可用于处理XML文档处理

+0

sax似乎不支持xpath。 –

-2

给杰克逊的lib一个尝试,它的fastes XML/JSON的一个p

1

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

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

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

2

如果您的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); 
    } 

}