2012-02-21 3 views
8

Мне нужно прочитать несколько больших (200Mb-500Mb) XML-файлов, поэтому я хочу использовать StaX. Моя система имеет два модуля - один для чтения файла (с помощью StaX); другой модуль (модуль «синтаксический анализатор»), чтобы получить одну запись этого XML и проанализировать его с помощью DOM. Мои XML-файлы не имеют определенной структуры, поэтому я не могу использовать JaxB. Как передать модуль «синтаксический анализатор» конкретную запись, которую я хочу проанализировать? Например:Чтение большого XML-файла с использованием stax и dom

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

Я хочу использовать Stax, чтобы разобрать этот файл - но каждый элемент «элемент» будет передан к модулю «парсер».

Edit:
После немного больше чтения - Я думаю, что мне нужна библиотека, которая считывает файл XML с помощью потока - но разобрать каждую запись с помощью DOM. Что-то подобное существует?

+0

Вы рассматривали использование vtd-xml (http://vtd-xml.sf.net), это намного лучше, чем DOM и SAX? –

ответ

14

Вы можете использовать (javax.xml.stream) анализатор StAX и преобразование (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

+0

Для меня, в Java 8, строка 't.transform()' бросает TransformerException: * javax.xml.transform.TransformerException: не может преобразовать источник типа javax.xml.transform.stax.StAXSource *. –

+0

У меня был Apache Xalan как зависимость, и он предоставлял свой собственный TransformerFactory. Один из способов обойти эту проблему заключался в том, чтобы явно указать класс TransformerFactory: «TransformerFactory transformerFactory = TransformerFactory.newInstance (« com.sun.org.apache.xalan.internal.xsltc.trax.TransformerFactoryImpl », null);' –

0

вы можете попробовать XMLDog от JLibs.

Он оценивает xpath в XML-документе, используя SAX (без загрузки всего xml в память). и возвращает узлы dom для узлов по мере их попадания.

Таким образом, вы можете оценить xpath/Items/Item на вашем жирном документе xml. вы будете уведомлены о том, что каждый элемент узла разбирается. вы можете обработать текущий элемент dom dom и продолжить.

Таким образом, он подходит для оценки XPaths на больших документов

Смежные вопросы