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

StackOverflow https://stackoverflow.com/questions/10586

  •  08-06-2019
  •  | 
  •  

Вопрос

В настоящее время я пытаюсь прочитать 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)

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top