Как проанализировать большой XML-файл с Java, чанк за чанк - PullRequest
0 голосов
/ 05 мая 2019

Я пытаюсь проанализировать большой XML-файл с помощью Java, по частям, чтобы серверу не приходилось хранить весь файл в памяти.

Мой код Javascript разрезает файлиспользуя функцию слайса File API и отправляет около 2 Мб за раз на сервер.Я использую AppEngine, поэтому не могу сохранить на диск.

Например, один блок:

<message:DataSet>
   <series>...</series>
   <series>...</series>
   <series>...</series> (and so on, thousands)

Блок два, три и т. Д. До eof:

   <series>...</series>
   <series>...</series>
   <series>...</series> (more)

Существует ли синтаксический анализатор какого-либо типа, в котором можно сохранить контекст / состояние / курсор, чтобы можно было продолжить анализ с дополнительными порциями данных?

Или, в противном случае, существует решение, которое может анализироватьбольшие XML-файлы без загрузки всего файла в память?

parser = new Parser(previousState);
parser.parse(moreData);

1 Ответ

1 голос
/ 06 мая 2019

Для тех, у кого схожие требования, я сталкивался с XML-процессором Aalto, который был почти тем же, что и я. Он имеет так называемый неблокирующий (асинхронный) синтаксический анализ XML. Он добавляет в StAX специальное событие EVENT_INCOMPLETE, которое позволяет вводить больше входных данных позже.

Например:

<root>value</root>
AsyncXMLInputFactory inputF = new InputFactoryImpl();

//Parse part 1
byte[] input_part1 = "<root>val".getBytes("UTF-8");
AsyncXMLStreamReader<AsyncByteArrayFeeder> parser = inputF.createAsyncFor(input_part1);

//Process events here

//Parse part 2
byte[] input_part2 = "ue</root>".getBytes("UTF-8");
parser.getInputFeeder().feedInput(input_part2);

//Process more events here

Большой пример здесь

Страница проекта Aalto XML на GitHub здесь

Обновление: Существует также Woodstox , который имеет еще больше функций, включая P_INPUT_PARSING_MODE, который позволяет более мягкий анализ (например, множественные корневые элементы). Оба решения от FasterXML.

...