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

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

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

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

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

14.08.2008 02:22:37
3 ОТВЕТА
РЕШЕНИЕ

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

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

2
14.08.2008 05:52:27

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

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

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

3
14.08.2008 04:13:24

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

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

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

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

2
10.08.2010 20:12:44