разделить огромные промежуточные XML-данные ГБ, сохранив заголовок и нижний колонтитул - ту же структуру - PullRequest
1 голос
/ 20 августа 2009

Моя программа будет получать XML размером от 8 до 10 ГБ со следующей структурой:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE gsafeed PUBLIC "-//Google//DTD GSA Feeds//EN" "">
<gsafeed>
<header>
<datasource>Name</datasource>
<feedtype>incremental</feedtype>
</header>
<group>
<record url="" action="add" mimetype="text/html" >
<content><![CDATA[ <html> <body><<br></body></html>  ]]>
</content>
</record>
<record url="" action="add" mimetype="text/html" >
<content><![CDATA[ <html> <body><<br></body></html>  ]]>
</content>
</record>
<record url="" action="add" mimetype="text/html" >
<content><![CDATA[ <html> <body><<br></body></html>  ]]>
</content>
</record>
</group>
</gsafeed>

Теперь я должен разделить этот XML-файл на один ГБ (приблизительно), сохранив ту же структуру, т. Е. Каждый разделенный файл должен иметь одинаковый верхний и нижний колонтитулы, за исключением того, что число <record> узлов будет меньше.

Я должен сделать это в JDK 1.4.

Пожалуйста, предложите.

Спасибо

1 Ответ

2 голосов
/ 20 августа 2009

Знаешь ли ты нижний колонтитул заранее? Если это так, вам просто необходим потоковый API, такой как StAX или SAX - StAX, вероятно, сделает это значительно проще, чем SAX, но он не встроен в Java 1.4, поэтому вам потребуется дополнительная зависимость.

В основном вам нужно сделать что-то вроде этого:

  1. Прочитайте заголовок и запомните его
  2. Читать элемент записи. Если их больше нет, перейдите к шагу 7.
  3. Есть ли у вас открытый файл? Если нет, откройте его и напишите в нем заголовок.
  4. Запись элемента записи в текущий файл.
  5. Достигли ли вы предела размера файла? Если это так, напишите нижний колонтитул и закройте его.
  6. Вернитесь к шагу 2.
  7. (Закончено чтение.) Если у вас есть открытый файл, напишите нижний колонтитул и закройте его.
...