Вудстокс Стакс и Ява Стакс конфликт - PullRequest
1 голос
/ 26 октября 2010

Я столкнулся со странным конфликтом во время выполнения между Woodstox STAX и реализацией java 1.6 STAX. Поскольку я использую CXF, он извлекает банку Woodstox как часть своей зависимости. Вот пример кода, который я использую.

import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.events.Attribute;
import javax.xml.stream.events.EndElement;
import javax.xml.stream.events.StartElement;
import javax.xml.stream.events.XMLEvent;

XMLInputFactory factory = (XMLInputFactory)XMLInputFactory.newInstance();
XMLEventReader reader =
factory.createXMLEventReader(new StringReader(xml)); 
while (reader.hasNext()){
XMLEvent event = reader.nextEvent();
switch (event.getEventType()){
case XMLEvent.START_ELEMENT :
StartElement se = event.asStartElement();
...........
...........
case XMLEvent.END_ELEMENT :
EndElement endElement = event.asEndElement();
if (event.asEndElement().getName().getLocalPart()==("document"))
// do something

Во время выполнения я получаю следующее исключение.

java.lang.Exception: java.lang.ClassCastException: com.ctc.wstx.evt.CompactStartElement cannot be cast to javax.xml.stream.events.EndElement

когда он достигает линии EndElement endElement = event.asEndElement();

Я немного озадачен, почему это вызывает в данный момент, хотя это не терпит неудачу в StartElement se = event.asStartElement();

Во время отладки я обнаружил, что объекты событий являются частью пакета com.ctc.wstx.evt, а не javax.xml.stream. Но не уверен, почему это не сработало раньше.

Любой указатель будет высоко оценен.

Ответы [ 3 ]

1 голос
/ 13 января 2011

Глядя на исключение, он говорит, что в основном нельзя привести StartElement к EndElement;это не похоже на несовместимость между реализациями Stax, а скорее где-то ошибка.Какая версия Woodstox это?

1 голос
/ 23 июня 2015

A break в конце XMLEvent.START_ELEMENT случая не должно быть здесь пропущено, иначе он просто перейдет к случаю END_ELEMENT с первым событием START_ELEMENT, следовательно, ClassCastException.

Эта часть кода была исключена из вопроса, поэтому я решил поместить это здесь на тот случай, если эта простая ошибка могла быть пропущена. Это то, как я получил то же исключение, которое все равно привело меня сюда, когда я понял, что мне нужен перерыв;)

1 голос
/ 26 октября 2010

Ну, у вас есть два возможных варианта поверхностного обзора:

  1. Используйте исключение зависимости, чтобы отключить Woodstox.CXF работает со встроенным StaX - выдает или принимает различные ошибки во встроенном Stax.

  2. Используйте Woodstox самостоятельно.

Однако конкретная ошибка здесь маловероятна.Я в основном рекомендую опубликовать это в списке пользователей cxf и сообщить нам, какую именно версию CXF вы используете.

...