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