Лучший парсер 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 Да Нет
Ответ 4
Простой XML http://simple.sourceforge.net/ очень упрощен для (де) сериализации объектов.
Ответ 5
В дополнение к SAX и DOM существует синтаксический анализ STaX, доступный с использованием XMLStreamReader, который представляет собой синтаксический анализатор xml.
Ответ 6
Я нашел dom4j инструментом для работы с XML. Особенно по сравнению с Xerces.
Ответ 7
Я бы не рекомендовал, что у вас есть много "мышления" в вашем приложении, но использование XSLT может быть лучше (и, возможно, быстрее с компиляцией XSLT-to-bytecode), чем манипуляции с Java.
Ответ 8
Если вам небезразлична производительность, я большой поклонник Apache Digester, поскольку он по существу позволяет вам напрямую сопоставлять XML с Java Beans.
В противном случае вы должны сначала разобрать, а затем построить свои объекты.