Лучший XML-парсер для Java
Мне нужно прочитать мелкие (не более нескольких МБ, в кодировке UTF-8) XML-файлы, покопаться в поиске различных элементов и атрибутов, возможно, изменить несколько и снова записать XML-файл на диск (желательно с хорошим форматированием с отступами),
Что будет лучшим парсером XML для моих нужд? Есть из чего выбирать. Вот некоторые из них, которые мне известны:
И, конечно, тот, что в JDK (я использую Java 6). Я знаком с Xerces, но считаю это неуклюжим.
Рекомендации?
8 ответов
Если скорость и память не проблема, то dom4j - действительно хороший вариант. Если вам нужна скорость, использование синтаксического анализатора StAX, такого как Woodstox, - это правильный путь, но вам нужно написать больше кода, чтобы добиться цели, и вы должны привыкнуть к обработке XML в потоках.
Я думаю, что вы не должны рассматривать какую-либо конкретную реализацию парсера. Java API для обработки XML позволяет вам использовать любую соответствующую реализацию синтаксического анализатора стандартным способом. Код должен быть намного более переносимым, и когда вы поймете, что определенный синтаксический анализатор слишком стар, вы можете заменить его другим без изменения строки кода (если вы делаете это правильно).
В основном, есть три способа обработки XML стандартным способом:
- SAX Это самый простой API. Вы читаете XML, определяя класс Handler, который получает данные внутри элементов / атрибутов, когда XML обрабатывается последовательным способом. Это быстрее и проще, если вы планируете только читать некоторые атрибуты / элементы и / или записывать некоторые значения обратно (ваш случай).
- DOM Этот метод создает дерево объектов, которое позволяет вам изменять / получать к нему доступ случайным образом, так что это лучше для сложных манипуляций и обработки XML.
- StAX Это посередине пути между SAX и DOM. Вы просто пишете код для извлечения данных из интересующего вас синтаксического анализатора при его обработке.
Забудьте о проприетарных API, таких как JDOM или Apache (например, Apache Xerces XMLSerializer), потому что они привязывают вас к конкретной реализации, которая может эволюционировать во времени или терять обратную совместимость, что заставит вас изменить свой код в будущем, когда вы захотите обновить его до новая версия JDOM или любой другой парсер, который вы используете. Если вы будете придерживаться стандартного API Java (используя фабрики и интерфейсы), ваш код будет гораздо более модульным и обслуживаемым.
Нет необходимости говорить, что все (я не проверял все, но я почти уверен) из предложенных синтаксических анализаторов соответствуют реализации JAXP, так что технически вы можете использовать все, независимо от того, какой именно.
Вот хорошее сравнение DOM, SAX, StAX и TrAX (Источник: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html)
Особенность StAX SAX DOM TrAX
Тип API Pull, потоковая передача Push, потоковая передача В дереве памяти правило XSLT
Простота использования Высокий Средний Высокий Средний
Возможность XPath Нет Нет Да Да
Процессор и память хорошо хорошо меняется
Только вперед Да Да Нет Нет
Читать XML Да Да Да Да
Написать XML Да Нет Да Да
CRUD Нет Нет Да Нет
Простой XML http://simple.sourceforge.net/ очень прост для (де) сериализации объектов.
В дополнение к SAX и DOM существует синтаксический анализ STaX с использованием XMLStreamReader, который представляет собой синтаксический анализатор XML.
Я обнаружил, что dom4j является инструментом для работы с XML. Особенно по сравнению с Xerces.
Я бы не рекомендовал это, потому что у вас много "мышления" в вашем приложении, но использование XSLT может быть лучше (и потенциально быстрее с компиляцией XSLT в байт-код), чем манипулирование Java.
Если вы меньше заботитесь о производительности, я большой поклонник Apache Digester, поскольку он по сути позволяет отображать напрямую из XML в Java Beans.
В противном случае вы должны сначала проанализировать, а затем построить ваши объекты.