从OMElement对象获取InputStream / io.Reader

时间:2011-11-22 04:10:28

标签: java xml axiom xmlstreamreader

我有一个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解码期间出错

1 个答案:

答案 0 :(得分:2)

getDataHandlerFromElement方法的目的是解码元素中包含的base64编码二进制数据,这不是你想要的。

Axiom目前没有流式拉线序器(我不知道任何其他支持这种情况的XML库)。它仅支持在推模式下序列化为XML,即通过写入OutputStream或Writer。您可以在单独的线程中进行序列化,并使用PipedOutputStream / PipedInputStream(类似于Activation为DataHource支持的DataHandler的DataHandler#getInputStream()所做的操作)。这将满足常量内存要求,但我想在您的情况下使用单独的线程所导致的开销是不可接受的。

我考虑过去实现这种拉序列化器的可能性,我认为这样做(不使用单独的线程)在技术上是可行的。请打开feature request for Axiom,以便我们可以在下一个版本中实现该功能。我认为这对Axiom来说是一个有趣的补充。