Лучший XML-парсер для Java

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

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

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

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

Думаю, больше игроков можно найти здесь: xml.com/lpt/a/1703

dma_k 18.03.2010 15:59

Я думаю, что с этим вопросом есть настоящие проблемы. 1 - это сравнение совершенно непохожих на вещи вещей, объединение парсеров (xerces, crimson) вместе с библиотеками для манипуляций с dom (dom4j, xom, jdom). также ответы имеют тенденцию к защите и не так конструктивны.

Nathan Hughes 22.01.2014 18:05

+220 и неконструктивно. Очевидно, что у модераторов и пользователей разные взгляды на то, что является конструктивным.

tbroberg 09.06.2014 10:40

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

Ashraff Ali Wahab 11.02.2016 19:26

@dma_k ваша ссылка не работает.

Gaurav 20.08.2019 12:52

К сожалению, да, ссылки больше нет. Это было размещено 9 лет назад. Я интересовался этой темой, когда собирал свой собственное исследование относительно того, какую библиотеку для манипуляций с DOM взять.

dma_k 21.08.2019 15:49

Библиотека Underscore-java может читать и генерировать строки XML.

Valentyn Kolesnikov 12.03.2021 16:54
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
393
7
317 876
8
Перейти к ответу Данный вопрос помечен как решенный

Ответы 8

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

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

Обычно существует три стандартных способа обработки XML:

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

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

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

Собственно, 3 способа: StAX (javax.xml.stream) - третий стандартный.

StaxMan 23.04.2009 08:00
java-samples.com/showtutorial.php?tutorialid=152 (лично люблю SAX)
kitokid 15.12.2012 10:42

@kitokid Chrome сообщает мне, что на странице есть неприятные вещи. Вместо этого я использовал это: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp

Ryan Shillington 17.12.2012 22:56

Хороший обзор: только с одной вещью, с которой я не согласен - в то время как для инкрементальной / потоковой передачи SAX и Stax хороши, стандартного API достаточно, для DOM это не так (IMO): есть веские причины для конкретных Java-подходов, например XOM, JDOM и DOM4J: не зависящая от языка DOM довольно громоздка в использовании.

StaxMan 27.01.2020 23:55
Ответ принят как подходящий

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

dom4j довольно хорош, но определенно не без проблем. Для хороших альтернатив dom4j см. stackoverflow.com/questions/831865/…

Jonik 06.06.2009 15:13

@zehrer они потокобезопасны?

Gaurav 20.08.2019 12:52

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

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

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

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

Evan 18.12.2008 04:48

Да, dom4j, вероятно, был бы лучшим решением там ... Раньше я много использовал его, пока не поднялся на один уровень до варочного котла

Uri 18.12.2008 09:03

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

Лучше, возможно: быстрее, очень маловероятно.

StaxMan 09.04.2009 10:18

Чтение, манипулирование и запись XML - это именно то, для чего предназначен XSLT. Это хороший готовый ответ.

james.garriss 17.11.2014 17:01

Вот хорошее сравнение DOM, SAX, StAX и TrAX (Источник: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html)

Feature                  StAX                  SAX                      DOM                  TrAX

Тип API                Поток, потоковое  NBSPB666 

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

Возможность XPath   No                       Нет                        Yes                      Yes

ЦП и память     Хорошо                  Хорошо                    Различная                  Варьируется

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

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

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

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

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

Dev 11.09.2013 00:38

Простой XML http://simple.sourceforge.net/ очень прост для (де) сериализации объектов.

Другие вопросы по теме