Мне нужно читать небольшие (максимум несколько МБ, в кодировке UTF-8) XML-файлы, рыться в различных элементах и атрибутах, возможно, изменить некоторые и снова записать XML на диск (желательно с красивым форматированием с отступом) .
Какой анализатор XML лучше всего подходит для моих нужд? Есть из чего выбирать. Некоторые из них, о которых я знаю:
И, конечно же, в JDK (я использую Java 6). Я знаком с Xerces, но считаю его неуклюжим.
Рекомендации?
Я думаю, что с этим вопросом есть настоящие проблемы. 1 - это сравнение совершенно непохожих на вещи вещей, объединение парсеров (xerces, crimson) вместе с библиотеками для манипуляций с dom (dom4j, xom, jdom). также ответы имеют тенденцию к защите и не так конструктивны.
+220 и неконструктивно. Очевидно, что у модераторов и пользователей разные взгляды на то, что является конструктивным.
Да, похоже, моды недальновидны, когда дело касается подобных вопросов. Да, ответы будут однозначными, но определенно основаны на опыте, и в большинстве случаев ответы выражаются количественно. Модам необходимо создать, вероятно, другой тег, чтобы переместить эти вопросы, которые открыты для обсуждения, что приводит к конструктивной критике и выводам.
@dma_k ваша ссылка не работает.
К сожалению, да, ссылки больше нет. Это было размещено 9 лет назад. Я интересовался этой темой, когда собирал свой собственное исследование относительно того, какую библиотеку для манипуляций с DOM взять.
Библиотека Underscore-java может читать и генерировать строки XML.




Я обнаружил, что dom4j - это инструмент для работы с XML. Особенно по сравнению с Xerces.
Я думаю, вам не стоит рассматривать какую-либо конкретную реализацию парсера. Java API для обработки XML позволяет стандартным образом использовать любую соответствующую реализацию парсера. Код должен быть намного более переносимым, и когда вы понимаете, что конкретный синтаксический анализатор стал слишком старым, вы можете заменить его другим, не меняя ни строчки кода (если вы все делаете правильно).
Обычно существует три стандартных способа обработки XML:
Забудьте о проприетарных API, таких как JDOM или Apache (например, XMLSerializer Apache Xerces), потому что они свяжут вас с конкретной реализацией, которая может развиваться со временем или терять обратную совместимость, что заставит вас изменить свой код в будущем, когда вы захотите перейти на новую версия JDOM или любого другого парсера, который вы используете. Если вы будете придерживаться стандартного API Java (с использованием фабрик и интерфейсов), ваш код будет намного более модульным и удобным для сопровождения.
Нет необходимости говорить, что все (я не проверял все, но почти уверен) предложенные парсеры соответствуют реализации JAXP, так что технически вы можете использовать все, независимо от того, какие.
Собственно, 3 способа: StAX (javax.xml.stream) - третий стандартный.
@kitokid Chrome сообщает мне, что на странице есть неприятные вещи. Вместо этого я использовал это: sce.uhcl.edu/yue/courses/xml/notes/xmlparser/IntroDOM.asp
Хороший обзор: только с одной вещью, с которой я не согласен - в то время как для инкрементальной / потоковой передачи SAX и Stax хороши, стандартного API достаточно, для DOM это не так (IMO): есть веские причины для конкретных Java-подходов, например XOM, JDOM и DOM4J: не зависящая от языка DOM довольно громоздка в использовании.
Если скорость и память не проблема, dom4j - действительно хороший вариант. Если вам нужна скорость, правильным решением будет использование анализатора StAX, такого как Woodstox, но вам нужно написать больше кода, чтобы все было сделано, и вам нужно привыкнуть обрабатывать XML в потоках.
dom4j довольно хорош, но определенно не без проблем. Для хороших альтернатив dom4j см. stackoverflow.com/questions/831865/…
@zehrer они потокобезопасны?
В дополнение к SAX и DOM существует синтаксический анализ STaX, доступный с использованием XMLStreamReader, который является синтаксическим анализатором XML.
Если вы меньше заботитесь о производительности, я большой поклонник Apache Digester, поскольку он, по сути, позволяет вам напрямую отображать XML в Java Beans.
В противном случае вам нужно сначала проанализировать, а затем построить свои объекты.
Мне не нужно создавать Java Beans, просто немного манипулирую необработанными элементами XML и просматриваю определенные элементы, чтобы получить от них данные, поэтому парсер в стиле DOM, вероятно, является моим идеальным решением.
Да, dom4j, вероятно, был бы лучшим решением там ... Раньше я много использовал его, пока не поднялся на один уровень до варочного котла
Я бы не советовал это делать, потому что в вашем приложении много «размышлений», но использование XSLT может быть лучше (и потенциально быстрее при компиляции XSLT в байт-код), чем манипуляции с Java.
Лучше, возможно: быстрее, очень маловероятно.
Чтение, манипулирование и запись XML - это именно то, для чего предназначен XSLT. Это хороший готовый ответ.
Вот хорошее сравнение DOM, SAX, StAX и TrAX (Источник: http://download.oracle.com/docs/cd/E17802_01/webservices/webservices/docs/1.6/tutorial/doc/SJSXP2.html)
Feature StAX SAX DOM TrAX
Тип API Поток, потоковое NBSPB666
Легкость использования Высокая Средняя Высокая Средняя
Возможность XPath No Нет Yes Yes
ЦП и память Хорошо Хорошо Различная Варьируется
Только вперед Да Да Нет Нет
Читать XML Да Да Да Да
Написать XML Да Нет Да Да
CRUD Нет Нет Да Нет
Вы можете писать XML с помощью SAX. Приемник предоставляет реализацию обработчика, для которого пользователь может вызывать события SAX для генерации вывода XML. (Я вижу, что таблица получена из источников, а не из оригинального материала, однако таблица неправильная)
Простой XML http://simple.sourceforge.net/ очень прост для (де) сериализации объектов.
Думаю, больше игроков можно найти здесь: xml.com/lpt/a/1703