2012-02-21 78 views
8

我需要讀取幾個大的(200Mb-500Mb)XML文件,所以我想使用StaX。 我的系統有兩個模塊 - 一個用於讀取文件(使用StaX);另一個模塊('parser'模塊)假設獲得該XML的單個條目並使用DOM解析它。 我的XML文件沒有特定的結構 - 所以我不能使用JaxB。 如何將'parser'模塊傳遞給我想要解析的特定條目? 例如:使用stax和dom讀取一個大的XML文件

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

我想用STAX來解析該文件 - 但每個「項目」條目將被傳遞到「分析器」模塊。

編輯:
多一點閱讀後 - 我想我需要讀取數據流使用XML文件庫 - 但解析使用DOM每個條目。有這樣的事嗎?

+0

你有沒有考慮使用vtd-xml(http://vtd-xml.sf.net),它比DOM和SAX好得多? – 2016-03-27 22:52:46

回答

14

你可以使用一個StAX的(javax.xml.stream)解析器和變換(javax.xml.transform)到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(); 
     } 
    } 

} 

另外見:

+0

謝謝,它對我很好!我用它,它幫助了我很多! – Noam 2012-03-07 07:57:06

+0

對於我來說,在Java 8中,'t.transform()'行引發了一個TransformerException:* javax.xml.transform.TransformerException:無法轉換類型爲javax.xml.transform.stax.StAXSource *的Source。 – 2017-10-13 16:20:56

+0

我將Apache Xalan作爲依賴項,並且它提供了自己的TransformerFactory。解決此問題的一種方法是顯式指定TransformerFactory類:'TransformerFactory transformerFactory = TransformerFactory.newInstance(「com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl」,null);' – 2017-10-13 16:57:23

0

你可以試試從JLibs的XMLDog

它使用SAX(即不將整個xml加載到內存中)評估xml文檔上的xpath。 ,並在節點命中時返回dom節點。

因此,您可以評估您的胖xml文檔上的xpath/Items/Item。您將在每個項目節點被解析時收到通知。您可以處理當前的Item dom節點,然後繼續。

因此,它是適合於各部分上的大文檔評估的XPath