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

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

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

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

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

Ответ 1

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

Ответ 2

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

В принципе существует три способа обработки XML стандартным образом:

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

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

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

Ответ 3

Вот хорошее сравнение 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                             Да                     Нет

Ответ 5

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

Ответ 6

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

Ответ 7

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

Ответ 8

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

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