Мне нужно прочитать маленькие (всего несколько МБ, кодированных в формате UTF-8) XML файлов, рыться вокруг различных элементов и атрибутов, возможно, изменить несколько и снова записать XML на диск (желательно с приятным, форматирование с отступом).
Каким будет лучший синтаксический анализатор XML для моих нужд? Есть много на выбор. Некоторые из них мне известны:
И, конечно, тот, что в JDK (я использую Java 6). Я знаком с Xerces, но считаю это неуклюжим.
Рекомендации
Если скорость и память не проблема, dom4j - действительно хороший вариант. Если вам нужна скорость, использование парсера StAX, такого как Woodstox, является правильным путем, но вам нужно написать больше кода, чтобы все было сделано, и вам нужно привыкнуть обрабатывать XML в потоках.
Я думаю, вы не должны рассматривать какую-либо конкретную реализацию парсера. Java API для обработки XML позволяет использовать стандартную реализацию любой совместимой парсера. Код должен быть гораздо более портативным, и когда вы поймете, что определенный синтаксический анализатор стал слишком старым, вы можете заменить его другим без изменения строки вашего кода (если вы сделаете это правильно).
В принципе существует три способа обработки XML стандартным образом:
Забудьте о проприетарных API, таких как JDOM или Apache (т.е. Apache Xerces XMLSerializer), потому что привяжет вас к конкретной реализации, которая может развиваться в или потерять обратную совместимость, что заставит вас изменить свой код в будущем, когда вы захотите перейти на новую версию JDOM или любой другой парсер, который вы используете. Если вы придерживаетесь стандартного API Java (используя фабрики и интерфейсы), ваш код будет намного более модульным и поддерживаемым.
Нет необходимости говорить, что все (я не проверял все, но я почти уверен) из предложенных парсеров согласен с реализацией JAXP, поэтому технически вы можете использовать все, независимо от того, что.
Вот хорошее сравнение 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 Да Нет
Простой XML http://simple.sourceforge.net/ очень упрощен для (де) сериализации объектов.
В дополнение к SAX и DOM существует синтаксический анализ STaX, доступный с использованием XMLStreamReader, который представляет собой синтаксический анализатор xml.
Я нашел dom4j инструментом для работы с XML. Особенно по сравнению с Xerces.
Я бы не рекомендовал, что у вас есть много "мышления" в вашем приложении, но использование XSLT может быть лучше (и, возможно, быстрее с компиляцией XSLT-to-bytecode), чем манипуляции с Java.
Если вам небезразлична производительность, я большой поклонник Apache Digester, поскольку он по существу позволяет вам напрямую сопоставлять XML с Java Beans.
В противном случае вы должны сначала разобрать, а затем построить свои объекты.