Мне нужно прочитать небольшие (максимум несколько МБ, кодировка UTF-8) XML-файлы, порыться в поисках различных элементов и атрибутов, возможно, изменить несколько и снова записать XML на диск (желательно с хорошим форматированием с отступами).
Какой анализатор XML был бы лучшим для моих нужд? Есть из чего выбирать. Некоторые, о которых я знаю, следующие:
И, конечно, тот, что есть в JDK (я использую Java 6). Я знаком с Xerces, но нахожу его неуклюжим.
Рекомендации?
Переведено автоматически
Ответ 1
Я думаю, вам не следует рассматривать какую-либо конкретную реализацию анализатора. Java API для обработки XML позволяет вам использовать любую соответствующую реализацию анализатора стандартным способом. Код должен быть намного более переносимым, и когда вы поймете, что конкретный анализатор устарел, вы можете заменить его другим, не изменяя ни строчки вашего кода (если вы делаете это правильно).
В принципе, существует три стандартных способа обработки XML:
SAX Это самый простой API. Вы считываете XML, определяя класс обработчика, который получает данные внутри элементов / атрибутов, когда XML обрабатывается последовательным способом. Это быстрее и проще, если вы планируете только прочитать некоторые атрибуты / элементы и / или записать некоторые значения обратно (в вашем случае).
DOM Этот метод создает дерево объектов, которое позволяет вам изменять его случайным образом, поэтому оно лучше подходит для сложных манипуляций с XML.
StAX Находится посередине пути между SAX и DOM. Вы просто пишете код для извлечения данных из интересующего вас анализатора при их обработке.
Забудьте о проприетарных API, таких как JDOM или Apache (т. Е. Apache Xerces XmlSerializer), потому что они привяжут вас к конкретной реализации, которая может развиваться со временем или потерять обратную совместимость, что заставит вас изменить свой код в будущем, когда вы захотите перейти на новую версию JDOM или любого другого анализатора, который вы используете. Если вы будете придерживаться стандартного Java API (используя фабрики и интерфейсы), ваш код будет намного более модульным и ремонтопригодным.
Нет необходимости говорить, что все (я не проверял все, но я почти уверен) из предложенных анализаторов соответствуют реализации JAXP, поэтому технически вы можете использовать все, независимо от того, какие именно.
Тип API Pull, streaming Push, streaming In memory tree XSLT Правило
Простота использования Высокий средний Высокий средний
Возможности XPath Нет Нет Да Да
ПРОЦЕССОР и память Хорошее Зависит от хорошего
Только пересылка Да, да, Нет, Нет
Читать XML Да, да, да
Написать XML Да Нет Да Да
CRUD Нет Нет Да Нет
Ответ 3
Если скорость и память не являются проблемой, dom4j - действительно хороший вариант. Если вам нужна скорость, использование анализатора StAX, такого как Woodstox, является правильным способом, но вам придется написать больше кода, чтобы добиться цели, и вы должны привыкнуть обрабатывать XML в потоках.