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

362

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

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

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

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

  • 6
    Я думаю, вы можете найти больше игроков здесь: xml.com/lpt/a/1703
  • 1
    Я думаю, что есть реальные проблемы с этим вопросом. 1 - он сравнивает совершенно разные вещи, объединяя парсеры (xerces, crimson) вместе с библиотеками dom-манипуляций (dom4j, xom, jdom). также ответы имеют тенденцию к защите и не настолько конструктивны.
Показать ещё 4 комментария
Теги:
parsing

8 ответов

75
Лучший ответ

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

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

Я думаю, вы не должны рассматривать какую-либо конкретную реализацию парсера. 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) является третьим стандартным.
  • 1
    java-samples.com/showtutorial.php?tutorialid=152 (лично люблю SAX)
Показать ещё 1 комментарий
133

Вот хорошее сравнение 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, streaming   Push, streaming   В дереве данных   XSLT Rule

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

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

ЦП и память                                         Varies                   Изменяется

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

Чтение XML                   Да                     Да                           Да                     Да

Write XML               Да                     N                             Да                     Да

CRUD                              ; N                         N                             Да                     Нет

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

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

4

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

3

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

2

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

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

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню