Парсинг очень больших XML-документов (и немного больше) в Java

Вы должны иметь эти строки в своем composer.json

"require-dev": {
    "heroku/heroku-buildpack-php": "*"
 }

, чтобы запустить composer update после их добавления.

18
задан Chris R 10 December 2008 в 12:41
поделиться

5 ответов

Stax является правильным путем. Я рекомендовал бы смотреть Woodstox

12
ответ дан 30 November 2019 в 08:27
поделиться

Это походит на задание для StAX ( JSR 173). StAX является синтаксическим анализатором получения по запросу, что означает, что он работает более или менее как основанный на событии синтаксический анализатор как SAX, но что Вы имеете больше контроля, когда прекратить читать, который элементы вытянуть...

удобство использования этого решения будет во многом зависеть от того, что на самом деле делают Ваши дополнительные классы, если Вы управляете их реализацией, и т.д.

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

Реализации StAX могут быть найдены от SUN ( SJSXP), Codehaus или несколько других поставщиков.

7
ответ дан 30 November 2019 в 08:27
поделиться

Вы могли использовать BufferedInputStream с очень большим размером буфера и использованием mark() перед дополнительными работами класса и reset() впоследствии.

, Если части дополнительному классу нужно, очень далеко в файл, то это могло бы стать чрезвычайно интенсивно использующим память, 'все же.

А более общее решение состояло бы в том, чтобы записать Ваше собственное BufferedInputStream-workalike, который буферизует к диску, если данные, которые должны быть буферизованы, превышают некоторый предварительно установленный порог.

3
ответ дан 30 November 2019 в 08:27
поделиться

Я записал бы пользовательскую реализацию InputStream, который дешифрует байты в файле, и затем используйте SAX для парсинга получающегося XML, поскольку это отрывается поток.

SAXParserFactory.newInstance().newSAXParser().parse(
  new DecryptingInputStream(), 
  new MyHandler()
);
3
ответ дан 30 November 2019 в 08:27
поделиться

Вам могло бы быть интересно XOM:

XOM довольно уникален в этом, это - двойной streaming/tree-based API. Отдельные узлы в дереве могут быть обработаны, в то время как документ все еще создается. Позволение программ XOM работать почти с такой скоростью, как базовый синтаксический анализатор может снабдить данными. Вы не должны ожидать документа, который будет полностью проанализирован, прежде чем можно будет начать работать с ним.

XOM является очень эффективной памятью. При чтении всего документа в память XOM использует как можно меньше памяти. Что еще более важно, XOM позволяет Вам фильтровать документы, поскольку они создаются так, Вы не должны создавать части дерева, которым Вы не интересуетесь. Например, можно пропустить текстовые узлы здания, которые только представляют граничный пробел, если такой пробел не является значительным в приложении. Можно даже обработать часть документа частью и выбросить каждую часть, когда Вы сделаны с нею. XOM использовался для обработки документов, которые являются гигабайтами в размере.

1
ответ дан 30 November 2019 в 08:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: