XML API для лучшей производительности

У меня есть приложение, которое работает с большим количеством XML-данных. Итак, я хочу спросить вас, какой API лучше всего подходит для обработки XML в java. Сегодня я использую W3 и для повышения производительности хочу перейти на какой-нибудь API. Я создаю XML с нуля, много преобразований, импорт в базу данных (mysql, mssql и т. д.), экспорт из базы данных в html, изменение этих XML и многое другое.

Является ли JDOM лучшим вариантом? вы знаете что-нибудь лучше, чем JDOM? Я слышал (читая страницы) о javolution. Кто-нибудь пользуется?

Какой API вы мне порекомендуете?


person jotapdiez    schedule 04.07.2011    source источник
comment
У каждого API есть слабые и сильные стороны. Сильные стороны обычно вызваны исправлением слабости другого API. Какие сильные стороны вам нужны?   -  person Thorbjørn Ravn Andersen    schedule 04.07.2011


Ответы (3)


Если у вас есть большие объемы данных, главное — не загружать их все в память сразу (потому что это будет использовать огромный объем памяти, а также потому, что это предотвращает перекрытие операций ввода-вывода и обработки). К сожалению, я считаю, что большинство 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

Ответ зависит от того, какие аспекты производительности важны для вашего приложения. Одним из факторов является то, работаете ли вы с большими XML-документами.

Для синтаксического анализа подходы на основе DOM не будут хорошо масштабироваться для больших документов. Если вам нужно анализировать большие документы, синтаксические анализаторы без DOM, такие как использующие SAX и StAX, будут быстрее и менее ресурсоемкими. Однако, если вам нужно преобразовать XML после синтаксического анализа, используя либо XSL, либо DOM API, вам в любом случае понадобится весь документ в памяти.

Для создания XML из кода StAX предоставляет для этого хороший API. Поскольку подход основан на потоках, он хорошо масштабируется для написания очень больших документов.

person sudocode    schedule 04.07.2011

Ну, большинство разработчиков, которых я знаю, и я сам, мы используем dom4J, возможно, если у вас есть время, вы могли бы написать небольшой тест производительности с использованием обоих фреймворков, тогда вы увидите разницу. Я предпочитаю dom4j.

person Java_Waldi    schedule 04.07.2011