2010-10-26 54 views
1

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

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

任何指针将不胜感激。

+0

你解决dis问题吗? – 2017-05-26 19:08:18

回答

1

那么,你必须从粗浅的看法两种可能的选择:

  1. 使用依赖排除关闭Woodstox。 CXF与内置的StaX一起工作 - 给内置的Stax带来各种缺陷。

  2. 自己使用Woodstox。

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

+0

感谢bmargulies ..我也在考虑直接使用woodstox对象,但无法找到将提供一些信息的文档/示例... – Shamik 2010-10-26 01:19:51

+0

只需使用Woodstox包中的工厂即可。他们的javadoc有他们。 – bmargulies 2010-10-26 18:11:37

1

看着这个异常,它基本上说不能将StartElement投射到EndElement;它似乎不像stax实现之间的不兼容性,而是某处的错误。这是哪个Woodstox版本?

1

A breakXMLEvent.START_ELEMENT这个案例不应该在这里丢失,否则它只会继续到第一个START_ELEMENT事件的END_ELEMENT案例,因此是ClassCastException。

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