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