2

我面临 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。但不知道为什么它以前没有失败。

任何指针将不胜感激。

4

3 回答 3

2

好吧,从表面上看,您有两种可能的选择:

  1. 使用依赖项排除来关闭 Woodstox。CXF 与内置的 StaX 一起工作——在内置的 StaX 中给予或接受各种错误。

  2. 自己使用伍德斯托克斯。

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

于 2010-10-26T01:13:03.797 回答
1

查看异常,它基本上说不能将 StartElement 转换为 EndElement;这似乎不是 stax 实现之间的不兼容,而是某个地方的错误。这是哪个伍德斯托克斯版本?

于 2011-01-13T19:14:29.990 回答
1

break此处不应缺少案例末尾的A ,XMLEvent.START_ELEMENT否则它将继续END_ELEMENT使用第一个 START_ELEMENT 事件的案例,因此会出现 ClassCastException。

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

于 2015-06-23T18:11:24.707 回答