Небольшая модификация XML-документа с использованием StAX

В настоящее время я пытаюсь прочитать XML-файл, внести некоторые незначительные изменения (изменить значение некоторых атрибутов) и снова записать его.

Я намеревался использовать синтаксический анализатор StAX ( javax.xml.stream.XMLStreamReader ) для чтения в каждом событии, чтобы посмотреть, нужно ли его изменить, а затем передать его прямо в StAX writer ( javax.xml.stream.XMLStreamReader ), если никаких изменений не требуется.

К сожалению, это не выглядит так просто - писатель не имеет возможности взять тип события и объект парсера, только такие методы, как writeAttribute и writeStartElement . Очевидно, я мог бы написать большой оператор switch с регистром для каждого возможного типа элемента, который может встречаться в XML-документе, и просто записать его снова, но это похоже на много проблем для чего-то, что кажется, что это должно быть просто .

Есть ли что-то, что мне не хватает, что позволяет легко написать XML-документ, очень похожий на тот, который вы читаете с помощью StAX?

Ответов (3)

Решение

StAX работает очень хорошо и очень быстро. Я использовал его в проекте для анализа файлов XML размером до 20 МБ. У меня нет тщательного анализа, но он определенно был быстрее, чем SAX.

Что касается вашего вопроса: разница между потоковой передачей и обработкой событий, AFAIK - это контроль. С помощью потокового API вы можете шаг за шагом просматривать свой документ и получать желаемое содержимое. В то время как API на основе событий вы можете обрабатывать только то, что вам интересно.

После того, как мы немного поработали, ответ, похоже, будет заключаться в использовании версий для чтения / записи событий, а не в версиях Stream.

(т.е. javax.xml.stream.XMLEventReader и javax.xml.stream.XMLEventWriter)

См. Также http://www.devx.com/tips/Tip/37795 , это то, что наконец заставило меня двигаться.

Я знаю, что это довольно старый вопрос, но если кто-то еще ищет что-то подобное, есть другая альтернатива: API расширения Woodstox Stax2 имеет метод:

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

который копирует текущее указанное событие из средства чтения потока с помощью средства записи потока. Это не только просто, но и очень эффективно. Я успешно использовал его для подобных модификаций.

(как получить XMLStreamWriter2 и т. д.? Все экземпляры, предоставленные Woodstox, реализуют эти расширенные версии - плюс есть оболочки на случай, если кто-то захочет также использовать «базовые» варианты Stax)