2011-05-03 73 views
1

我正在使用java 6并且rt.jar具有执行基于STaX解析所需的所有类。主要是我使用以下类:STaX解析器的行为不同

import javax.xml.stream.XMLEventReader; 
import javax.xml.stream.events.XMLEvent; 
import javax.xml.stream.XMLInputFactory; 
import javax.xml.stream.XMLStreamException; 

当我运行下面作为一个Java应用程序:

while(reader.hasNext()) {    
XMLEvent elementsEvent = reader.nextEvent(); 
System.out.println(elementsEvent.toString()); 
-------- 
} 

它工作正常,但是当我部署到JBoss的这一点,表现不同。有谁知道这里可能是什么问题?

+3

你打算告诉我们的不仅仅是“它的行为不同”吗? – skaffman 2011-05-03 19:57:03

+0

在执行SUN的情况下,上面的代码打印xml文件中的文本,而在JBoss的情况下打印EventType – 2011-05-04 09:56:05

+0

这是因为'toString()'是作为人类可读的表示。你不应该把它用于“真实”的东西。 – skaffman 2011-05-04 10:39:24

回答

4

JBoss使用此处的RI:http://stax.codehaus.org/Home作为STAX提供程序。我猜想JDK可能默认使用SJSXP。

由于在XMLEvent的API上没有指定toString()的行为,所以它的实现取决于打印出来的结果。有些实现会转储普通的旧的Object#toString(),有些实现可能会写出XML等。实际上,您依赖的是javax包接口未指定的实现细节。

通过在开发环境中使用codehaus stax实现,您可以获得一致的行为,但当然您仍然使用供应商特定的功能。这个问题已经在过去与其他XML API一起出现了,当Sun改变了提供者。org.w3c.dom.Element用于从toString打印XML,但它是提供者行为,然后有一天它改变了和许多人的代码打破了!)

+0

谢谢感动,这是确切的问题,解决这个问题的方法是使用toString() – 2011-05-08 17:40:11