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

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

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

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

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

Ответы [ 3 ]

3 голосов
/ 14 августа 2008

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

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

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

2 голосов
/ 11 августа 2010

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

XMLStreamWriter2.copyEventFromReader(XMLStreamReader2 r, boolean preserveEventData) 

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

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

2 голосов
/ 14 августа 2008

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

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

...