2013-06-14 4 views
2

У меня есть некоторые данные (около 150-200 МБ), которые мне нужно преобразовать в XML-файл. Я ранее пытался сделать это на основе DOM, но память является большим ограничением.Написание огромных XML-файлов с помощью StAX

Я начал изучать реализацию StaX и имею несколько запросов.

Допустим, у меня есть следующий код.

XMLStreamWriter writer = factory.createXMLStreamWriter(new FileWriter("output.xml")); 
    writer.writeStartDocument(" "); 
    writer.writeStartElement(" "); 
    writer.writeStartElement(""); 
    // call method X a million times 
    writer.writeEndElement(" "); 
    writer.flush(); 
    writer.close(); 

    // method x 
    X() { 
    writer.writeStartElement(" "); 
    writer.writeEndElement(); 
    } 
  1. Я предполагаю, что всякий раз, когда метод X выполняется, он записывает элемент в файл. Это не будет содержать преобразованный XML до сих пор в памяти. Я прав?

  2. Закрывает ли эти закрытые теги автоматически, как первые 2 элемента запуска?

  3. Могу ли я смывать писатель и снова использовать один и тот же писатель, чтобы добавить еще несколько XML в файл, например так:

    X() 
    { 
        writer.writeStartElement(" "); 
        writer.writeEndElement(); 
        writer.flush(); 
    } 
    
+0

Является ли структура XML очень сложной (множество узлов разных типов и глубокая иерархия)? – Rafa

+0

Да. Данные динамические, и нам нужно создать XML на основе данных – Flash

+0

Ok. Я думал, что это будет просто анализ данных. Таким образом, возможно, вы подумали бы об этом вручную, используя легкий StringBuffer. У меня нет ответа на # 1 или # 2, но у меня есть ощущение, что у вас будут проблемы. Вы считали JAXB? – Rafa

ответ

1
  1. Да, но вы должны буфер некоторые (маленький) пишет в буфере. Вы должны использовать BufferedWriter в дополнение к FileWriter. В противном случае он вызывает слишком много системных вызовов, например.

  2. Он записывает концевые теги после вызова writeEndElement().

  3. Да, это должен быть путь.

2

Я предполагаю, что всякий раз, когда метод X выполняется, он записывает элемент в файл. Это не будет содержать преобразованный XML до сих пор в памяти . Я прав?

Анализатор STAX может буферизовать подмножества XML в памяти, прежде чем записывать их в файл, чтобы уменьшить объем операций ввода-вывода для улучшения производительности. Он не будет кэшировать так сильно, что у вас не хватает памяти.

Закрытие закрытых тегов автоматически, как первые 2 старта элементов?

Метод writeEndDocument автоматически закрывает любые закрытые теги.

Могу ли я смывать писатель и снова использовать один и тот же писатель, чтобы добавить еще некоторые XML в файл, например так:

Вы можете продолжать использовать тот же XMLStreamWriter для записи содержимого в файл XML до тех пор, пока вы не назовете writeEndDocument. Вам не нужно явно вызывать flush, прежде чем писать больше контента.Как только вы закончите с XMLStreamWriter, вы должны позвонить ему close, чтобы освободить его.

+1

Спасибо. Это помогло. :) – Flash