我有一个OMElement
对象,我希望得到一个InputStream
或读者对象。我想要的是从我拥有的xml
流式传输OMElement
,而不会被加载到内存中。我只能从中得到XMLStreamReader
个对象。但我找不到从中获取InputStream/Reader
的方法。
OMElement element /*I have this object */
XMLStreamReader xmlreader = element.getXMLStreamReaderWithoutCaching();
任何人都可以帮助我吗?我真的很感激!
由于
PS:我已经找到了一个获取InputStream的方法,但它提供了一个异常,我需要帮助来解决它。
XMLStreamReader xmlReader = element.getXMLStreamReader(false);
try {
if (xmlReader.getEventType() == XMLStreamReader.START_DOCUMENT) {
xmlReader.next();
}
DataHandler handler = XMLStreamReaderUtils.getDataHandlerFromElement(xmlReader);
handler.getInputStream();
对getDataHandlerFromElement的调用会生成异常 javax.xml.stream.XMLStreamException:base64解码期间出错
答案 0 :(得分:2)
getDataHandlerFromElement方法的目的是解码元素中包含的base64编码二进制数据,这不是你想要的。
Axiom目前没有流式拉线序器(我不知道任何其他支持这种情况的XML库)。它仅支持在推模式下序列化为XML,即通过写入OutputStream或Writer。您可以在单独的线程中进行序列化,并使用PipedOutputStream / PipedInputStream(类似于Activation为DataHource支持的DataHandler的DataHandler#getInputStream()所做的操作)。这将满足常量内存要求,但我想在您的情况下使用单独的线程所导致的开销是不可接受的。
我考虑过去实现这种拉序列化器的可能性,我认为这样做(不使用单独的线程)在技术上是可行的。请打开feature request for Axiom,以便我们可以在下一个版本中实现该功能。我认为这对Axiom来说是一个有趣的补充。