2013-06-22 33 views
5

là gì cách nhanh nhất để truy vấn một file XML rất lớn trong java,Cách nhanh nhất để truy vấn xml trong java

DOM - xpath: đây đang tiến hành rất nhiều thời gian,

 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); 

với dòng cuối cùng trong mã, chương trình kết thúc sau 40 giây và không có trong 1 giây.

SAX: Tôi không biết nếu điều này có thể được sử dụng cho truy vấn, trên internet tôi chỉ có thể tìm thấy các ví dụ về phân tích cú pháp.

Các tùy chọn khác để thực hiện truy vấn nhanh hơn, kích thước tệp xml của tôi là khoảng 5MB. Thnx

+0

Bạn đã thử StAX hoặc JAXB chưa? – davek

+0

Nhanh nhất (như đã được chứng minh lặp lại) là vtd-xml (http://vtd-xml.sf.net) –

Trả lời

1

Có một cái nhìn tại SAX api, bởi vì nó là cơ chế nhiều bộ nhớ nhanh nhất và ít nhất là hiện đang có sẵn để đối phó với tài liệu XML

+0

sax dường như không hỗ trợ xpath. –

-2

Cho Jackson lib thử xem, nó là một trong những fastes xml/json p

1

Tùy thuộc vào loại truy vấn bạn muốn thực hiện.

Nếu, ví dụ, bạn chỉ muốn tìm một nút bằng ID và sau đó đọc nội dung văn bản SAX sẽ rất nhanh nhưng sẽ yêu cầu mã hóa nhỏ để viết trình xử lý SAX (có thể mở rộng từ this).

Nếu, mặt khác, bạn muốn thực hiện truy vấn khá phức tạp dọc theo dòng "có nút tổ tiên thứ ba của foo nơi foo có con bah" bạn sẽ phải sử dụng xpath nhiều như trình xử lý SAX sẽ phức tạp đến mức không thể.

2

Nếu thuộc tính id thuộc loại xs:ID và bạn có lược đồ XML cho tài liệu của mình thì bạn có thể sử dụng phương thức Document.getElementById(String). Tôi sẽ trình bày dưới đây với một ví dụ.

XML Schema

<?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 (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> 

Demo

Bạn sẽ cần phải thiết lập các thể hiện của Schema trên DocumentBuilderFactory để có được bao giờ mọi thứ để làm việc.

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

Công cụ XPath mặc định của Jdk nổi tiếng với hiệu suất chậm. Bạn nên xem xét Jaxen hoặc vtd-xml. Xem các rticles sau ....

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

+0

Bạn có thể muốn đề cập đến vtd-xml là một sản phẩm thương mại. –

+0

Vtd-xml được cấp phép theo gpl, nhưng nó cũng được cấp phép thương mại –

Các vấn đề liên quan