Лучший анализатор XML для Java [закрыто]

387

Мне нужно прочитать мелкие (не более нескольких МБ, в кодировке UTF-8) XML-файлы, покопаться в поиске различных элементов и атрибутов, возможно, изменить некоторые из них и снова записать XML на диск (желательно с хорошим форматированием с отступами) ,

Что будет лучшим парсером XML для моих нужд? Есть из чего выбирать. Вот некоторые из них, которые мне известны:

И, конечно, тот, что в JDK (я использую Java 6). Я знаком с Xerces, но считаю это неуклюжим.

Рекомендации?

Evan
источник
6
Я думаю, вы можете найти больше игроков здесь: xml.com/lpt/a/1703
dma_k
1
я думаю, что есть реальные проблемы с этим вопросом. Во-первых, он сравнивает совершенно разные вещи, объединяя парсеры (xerces, crimson) вместе с библиотеками dom-манипуляций (dom4j, xom, jdom). также ответы имеют тенденцию к защите и не настолько конструктивны.
Натан Хьюз
51
+220 и не конструктивно. Очевидно, что модераторы и пользователи имеют разные взгляды на то, что конструктивно.
tbroberg
5
Да, кажется, что моды близоруки, когда дело доходит до таких вопросов. Да, ответы будут взвешенными, но определенно основанными на опыте, и в большинстве случаев ответы количественно определены. Модам необходимо создать, вероятно, другой тег, чтобы переместить эти вопросы, которые открыты для обсуждения, что приводит к конструктивной критике и выводам.
Ашраф Али Вахаб
@dma_k ваша ссылка не работает.
Гаурав

Ответы:

81

Если скорость и память не проблема, то dom4j - действительно хороший вариант. Если вам нужна скорость, использование синтаксического анализатора StAX, такого как Woodstox, - правильный путь, но вам нужно написать больше кода, чтобы добиться цели, и вы должны привыкнуть обрабатывать XML в потоках.

zehrer
источник
6
dom4j довольно хорош, но определенно не без проблем. Для хороших альтернатив DOM4J см stackoverflow.com/questions/831865/...
Jonik
@zehrer они потокобезопасны?
Гаурав
257

Я думаю, что вы не должны рассматривать какую-либо конкретную реализацию парсера. Java API для обработки XML позволяет вам использовать любую соответствующую реализацию синтаксического анализатора стандартным способом. Код должен быть намного более переносимым, и когда вы понимаете, что определенный синтаксический анализатор слишком стар, вы можете заменить его другим без изменения строки кода (если вы делаете это правильно).

В основном есть три способа обработки XML стандартным способом:

  • SAX Это самый простой API. Вы читаете XML, определяя класс Handler, который получает данные внутри элементов / атрибутов, когда XML обрабатывается последовательным способом. Это быстрее и проще, если вы планируете только читать некоторые атрибуты / элементы и / или записывать некоторые значения обратно (ваш случай).
  • DOM Этот метод создает дерево объектов, которое позволяет вам изменять / получать к нему доступ случайным образом, так что это лучше для сложных манипуляций и обработки XML.
  • StAX Это середина пути между SAX и DOM. Вы просто пишете код для извлечения данных из интересующего вас синтаксического анализатора при его обработке.

Забудьте о проприетарных API, таких как JDOM или Apache (например, Apache Xerces XMLSerializer ), потому что они привязывают вас к конкретной реализации, которая может эволюционировать во времени или терять обратную совместимость, что заставит вас изменить свой код в будущем, когда вы захотите выполнить обновление до новая версия JDOM или любой другой парсер, который вы используете. Если вы будете придерживаться стандартного API Java (используя фабрики и интерфейсы), ваш код будет гораздо более модульным и обслуживаемым.

Нет необходимости говорить, что все (я не проверял все, но я почти уверен) из предложенных синтаксических анализаторов соответствуют реализации JAXP, так что технически вы можете использовать все, независимо от того, какой именно.

Фернандо Мигелес
источник
11
На самом деле, 3 способа: StAX (javax.xml.stream) является третьим стандартным.
StaxMan,
1
java-samples.com/showtutorial.php?tutorialid=152 (лично люблю SAX)
kitokid
@kitokid Chrome говорит мне, что на странице есть неприятные вещи. Я использовал это вместо: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Райан Шиллингтон
Хороший обзор: с одной вещью, с которой я бы не согласился - в то время как для инкрементной / потоковой передачи SAX и Stax хороши, стандартного API достаточно, для DOM это не так (IMO): есть веские причины для таких специфических для Java дублей, как XOM, JDOM и DOM4J: независимый от языка DOM довольно громоздок в использовании.
StaxMan
130

Вот хорошее сравнение 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 Type                 Pull, потоковая передача Push, потоковая передача В дереве памяти правило XSLT

Простота использования           Высокий Средний Высокий Средний

Возможность XPath    Нет Нет Да Да

Процессор и память     хорошо хорошо меняется

Только вперед        Да Да Нет Нет

Читать XML              Да Да Да Да

Написать XML              Да Нет Да Да

CRUD                      Нет Нет Да Нет

Кадир
источник
7
Вы можете написать XML с SAX. Приемник обеспечивает реализацию обработчика, с помощью которой пользователь может вызывать события SAX для генерации вывода XML. (Я вижу, что таблица получена из исходного материала, а не из оригинального материала, хотя таблица ошибочна)
Dev
4

В дополнение к SAX и DOM существует разбор STaX, доступный с использованием XMLStreamReader, который является синтаксическим анализатором XML.


источник
3

Я обнаружил, что dom4j является инструментом для работы с XML. Особенно по сравнению с Xerces.

Брайан Мэтьюз
источник
2

Я бы не рекомендовал это, потому что у вас много «мышления» в вашем приложении, но использование XSLT может быть лучше (и, возможно, быстрее с компиляцией XSLT-to-bytecode), чем манипулирование Java.


источник
3
Лучше, возможно: быстрее, очень маловероятно.
StaxMan
Чтение, манипулирование и запись XML - это именно то, для чего предназначен XSLT. Это хороший ответ из коробки.
james.garriss
1

Если вы меньше заботитесь о производительности, я большой поклонник Apache Digester, поскольку он по сути позволяет отображать напрямую из XML в Java Beans.

В противном случае вы должны сначала проанализировать, а затем построить ваши объекты.

Uri
источник
Мне не нужно создавать Java Beans, просто немного манипулировать необработанными XML-элементами и просматривать определенные элементы для получения данных из них, поэтому парсер стиля DOM, вероятно, является моим идеальным решением.
Эван
Да, dom4j, вероятно, был бы лучшим решением там ... Я использовал его интенсивно, пока не поднялся на один уровень, чтобы переварить
Uri