В настоящее время я пытаюсь прочитать файл XML, внести некоторые незначительные изменения (изменить значение некоторых атрибутов) и снова записать его обратно.
Я намеревался использовать синтаксический анализатор StAX ( javax.xml.stream.XMLStreamReader
) для чтения в каждом событии, посмотреть, хочу ли я изменить его, а затем передать его напрямую в StAX writer ( javax.xml.stream.XMLStreamReader
), если не требуется никаких изменений.
К сожалению, это не выглядит так просто - у автора нет способа взять тип события и объект парсера, только такие методы, как writeAttribute
и writeStartElement
. Очевидно, я мог бы написать большой оператор switch с регистром для каждого возможного типа элемента, который может встречаться в XML-документе, и просто записать его обратно, но это кажется большой проблемой для чего-то, что кажется простым ,
Есть ли что-то, чего мне не хватает, чтобы можно было легко написать XML-документ, очень похожий на тот, который вы читали в StAX?
StAX работает довольно хорошо и очень быстро. Я использовал его в проекте для анализа файлов XML размером до 20 МБ. У меня нет тщательного анализа, но он определенно был быстрее, чем SAX.
Что касается вашего вопроса: разница между потоковой передачей и обработкой событий, AFAIK это контроль. С потоковым API вы можете шаг за шагом пройтись по документу и получить желаемое содержимое. В то время как API на основе событий вы можете обрабатывать только то, что вас интересует.
После небольшого перебора ответа, похоже, можно использовать версии чтения / записи событий, а не версии потоков.
(т.е. 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)