STaX解析器的行为不同
问题描述:
我正在使用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的这一点,表现不同。有谁知道这里可能是什么问题?
答
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
你打算告诉我们的不仅仅是“它的行为不同”吗? – skaffman 2011-05-03 19:57:03
在执行SUN的情况下,上面的代码打印xml文件中的文本,而在JBoss的情况下打印EventType – 2011-05-04 09:56:05
这是因为'toString()'是作为人类可读的表示。你不应该把它用于“真实”的东西。 – skaffman 2011-05-04 10:39:24