2012-02-21 12 views
8

いくつかの大きな(200Mb〜500Mb)XMLファイルを読む必要があるので、私はStaXを使いたいと思います。 私のシステムは2つのモジュールを持っています - 1つはファイルを読み込みます(StaXで)。別のモジュール( 'パーサ'モジュール)は、その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)を使用してconsidereedしましたか?それはDOMとSAXよりはるかに優れていますか? –

答えて

14

をXPathを評価するのに適している。また、

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

+0

Java 8では、 't.transform()'行がTransformerExceptionをスローしています。* javax.xml.transform.TransformerException:型javax.xml.transform.stax.StAXSource *のソースを変換できません。 –

+0

私は依存としてApache Xalanを持っていて、独自のTransformerFactoryを提供していました。この問題を回避する方法の1つは、TransformerFactoryクラスを明示的に指定することでした。 'TransformerFactory transformerFactory = TransformerFactory.newInstance(" com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl "、null);' –

0

あなたはJLibsからXMLDogを試すことができます。

SAXを使用してxml文書のxpathを評価します(xml全体をメモリに読み込まない)。 を返し、ノードがヒットしたときにdomノードを返します。

したがって、fat xmlドキュメントのxpath/Items/Itemを評価することができます。 Itemノードが解析されるたびに通知されます。現在のアイテムDOMノードを処理して続行できます。

したがって、(javax.xml.transform)あなたはStAXの(javax.xml.stream)パーサーを使用して変換することができDOMノード(org.w3c.dom)への各セクション大きな文書に

関連する問題