Если у вас есть большие объемы данных, главное — не загружать их все в память сразу (потому что это будет использовать огромный объем памяти, а также потому, что это предотвращает перекрытие операций ввода-вывода и обработки). К сожалению, я считаю, что большинство DOM и DOM-подобных библиотек (например, DOM4J) делают именно это, поэтому они не очень подходят для эффективной обработки огромных объемов XML.
Вместо этого рассмотрите возможность использования потокового API, такого как SAX или StAX. StAX, по моему опыту, обычно проще в использовании.
Есть и другие API, которые пытаются дать вам удобство DOM с производительностью SAX. Javolution может быть одним из них; VTD-XML — другой. Но, честно говоря, я считаю, что с StAX довольно легко работать — это, по сути, причудливый поток, так что вы просто думаете так же, как если бы вы читали текстовый файл из потока.
Вы можете попробовать объединить JAXB со StAX. Идея состоит в том, что вы передаете файл с помощью StAX, а затем используете JAXB для демаршалирования фрагментов внутри него. Например, если вы обрабатывали фид Atom, вы могли открыть его, прочитать дальше заголовка, затем работайте в цикле, разматывая entry
элементы на объекты по одному. Это действительно работает, только если ваш формат состоит из последовательности независимых элементов, таких как Atom; это было бы в значительной степени бесполезно для чего-то более богатого, такого как XHTML. Вы можете увидеть примеры этого в эталонной реализации JAXB и сообщение в блоге парня.
person
Tom Anderson
schedule
04.07.2011