2012-02-21 44 views
8

Tôi cần đọc một số tệp XML lớn (200Mb-500Mb), vì vậy tôi muốn sử dụng StaX. Hệ thống của tôi có hai mô-đun - một để đọc tệp (với StaX); mô-đun khác (mô-đun 'trình phân tích cú pháp') giả sử để có được một mục nhập duy nhất của XML đó và phân tích cú pháp nó bằng cách sử dụng DOM. Các tệp XML của tôi không có cấu trúc nhất định - vì vậy tôi không thể sử dụng JaxB. Làm cách nào để chuyển mô-đun 'trình phân tích cú pháp' một mục cụ thể mà tôi muốn phân tích cú pháp? Ví dụ:Đọc một tệp XML lớn sử dụng stax và dom

<Items> 
    <Item> 
     <name> .... </name> 
     <price> ... </price> 
    </Item> 
    <Item> 
     <name> .... </name> 
     <price> ... </price> 
    </Item> 
</Items> 

Tôi muốn sử dụng Stax để phân tích tập tin đó - nhưng mỗi 'mục' nhập sẽ được chuyển đến các 'phân tích cú pháp' module.

Edit:
Sau một chút đọc hơn - Tôi nghĩ rằng tôi cần một thư viện mà đọc một tập tin XML sử dụng dòng - nhưng phân tích mỗi mục sử dụng DOM. Có một điều như vậy?

+0

Bạn đã cân nhắc sử dụng vtd-xml (http://vtd-xml.sf.net), nó có tốt hơn nhiều so với DOM và SAX không? –

Trả lời

14

Bạn có thể sử dụng một (javax.xml.stream) phân tích cú pháp Stax và transform (javax.xml.transform) mỗi phần để một nút DOM (org.w3c.dom):

import java.io.*; 
import javax.xml.stream.*; 
import javax.xml.transform.*; 
import javax.xml.transform.stax.StAXSource; 
import javax.xml.transform.dom.DOMResult; 
import org.w3c.dom.* 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     XMLInputFactory xif = XMLInputFactory.newInstance(); 
     XMLStreamReader xsr = xif.createXMLStreamReader(new FileReader("input.xml")); 
     xsr.nextTag(); // Advance to statements element 

     TransformerFactory tf = TransformerFactory.newInstance(); 
     Transformer t = tf.newTransformer(); 
     while(xsr.nextTag() == XMLStreamConstants.START_ELEMENT) { 
      DOMResult result = new DOMResult(); 
      t.transform(new StAXSource(xsr), result); 
      Node domNode = result.getNode(); 
     } 
    } 

} 

Cũng xem:

+0

Cảm ơn, Nó hoạt động tuyệt vời cho tôi! Tôi đã sử dụng nó và nó đã giúp tôi rất nhiều! – Noam

+0

Đối với tôi, trong Java 8, dòng 't.transform()' đang ném một TransformerException: * javax.xml.transform.TransformerException: Không thể chuyển đổi một nguồn kiểu javax.xml.transform.stax.StAXSource *. –

+0

Tôi đã có Apache Xalan như là một phụ thuộc, và nó đã được cung cấp TransformerFactory của riêng mình. Một cách để giải quyết vấn đề là chỉ rõ lớp TransformerFactory một cách rõ ràng: 'TransformerFactory transformerFactory = TransformerFactory.newInstance (" com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl ", null);' –

0

bạn có thể thử XMLDog từ JLibs.

Nó đánh giá xpath trên tài liệu xml bằng SAX (nghĩa là không tải toàn bộ xml vào bộ nhớ). và trả về các nút dom cho các nút khi chúng được nhấn.

do đó bạn có thể đánh giá xpath/Items/Item trên tài liệu xml chất béo của mình. bạn sẽ được thông báo khi mỗi nút Mục được phân tích cú pháp. bạn có thể xử lý nút dom Item hiện tại và tiếp tục.

Vì vậy nó là thích hợp cho việc đánh giá XPaths trên các tài liệu lớn

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