Woodstox stax和java stax冲突

时间:2010-10-26 00:58:54

标签: java stax woodstox

我正面临Woodstox STAX和java 1.6 STAX实现之间的奇怪运行时冲突。由于我使用的是CXF,它将Woodstox jar作为其依赖的一部分。这是我正在使用的示例代码。

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 个答案:

答案 0 :(得分:1)

嗯,从肤浅的观点来看,你有两种可能的选择:

  1. 使用依赖项排除功能关闭Woodstox。 CXF与内置的StaX配合使用 - 在内置的Stax中提供或消除各种错误。

  2. 自己使用Woodstox。

  3. 但是,这里的具体错误有点不太可能。我主要建议将其发布到cxf用户列表,并告诉我们您正在使用的CXF版本。

答案 1 :(得分:1)

查看异常,它基本上表示无法将StartElement强制转换为EndElement;它似乎不是stax实现之间的不兼容,而是某个地方的bug。这是哪个Woodstox版本?

答案 2 :(得分:1)

break案例末尾的XMLEvent.START_ELEMENT不应该在这里丢失,否则它将继续END_ELEMENT第一个START_ELEMENT事件,因此会出现ClassCastException。

这部分代码已经从问题中省略了,所以我想我会把它放在这里以防万一这个简单的错误可能被忽略了。当我意识到我需要休息时,这就是我得到了同样的例外情况,导致我在这里;)