2012-02-21 17 views
8

Potrzebuję przeczytać kilka dużych plików XML (200Mb-500Mb), więc chcę używać StaX. Mój system ma dwa moduły - jeden do odczytu pliku (ze StaX); inny moduł (moduł "analizatora składni") zakłada uzyskanie pojedynczego wpisu tego pliku XML i przeanalizowanie go za pomocą DOM. Moje pliki XML nie mają określonej struktury - więc nie mogę używać JaxB. W jaki sposób mogę przekazać moduł "analizatora składni" konkretny wpis, który chcę przeanalizować? Na przykład:Czytanie dużego pliku XML za pomocą stax i domena

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

chcę użyć Stax do analizowania tego pliku - ale każdy „przedmiot” Wpis zostanie przekazany do modułu „parsera”.

Edit:
Po trochę więcej czytania - Chyba muszę biblioteki, który odczytuje plik XML przy użyciu strumienia - ale analizować każdą pozycję używając DOM. Czy jest coś takiego?

+0

Czy uważałeś za pomocą vtd-xml (http://vtd-xml.sf.net), jest znacznie lepszy niż DOM i SAX? –

Odpowiedz

14

Można użyć Stax (javax.xml.stream) parser i transformacji (javax.xml.transform) każdy odcinek do węzła 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(); 
     } 
    } 

} 

także patrz:

+0

Dzięki, działa doskonale dla mnie! Użyłem tego i pomógł mi dużo! – Noam

+0

Dla mnie, w języku Java 8, linia 't.transform()' rzuca wyjątek TransformerException: * javax.xml.transform.TransformerException: Nie można przekształcić źródła typu javax.xml.transform.stax.StAXSource *. –

+0

Miałem Apache Xalan jako zależność, i to było dostarczanie własnego TransformerFactory. Jednym ze sposobów obejścia problemu było jawne określenie klasy TransformerFactory: 'TransformerFactory transformerFactory = TransformerFactory.newInstance (" com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl ", null);' –

0

możesz spróbować XMLDog od JLibs.

Dokonuje oceny xpath na dokumencie XML przy użyciu SAX (tj. Bez wczytywania całego xml do pamięci). i zwraca węzły dom dla węzłów, gdy są one trafione.

w ten sposób można ocenić xpath/Items/Item na grubym dokumencie xml. zostaniesz powiadomiony, gdy analizowany jest każdy węzeł elementu. możesz przetworzyć bieżący węzeł Pozycja dom i kontynuować.

zatem nadaje się do oceny xpaths na dużych dokumentach

Powiązane problemy