【问题标题】:Get an InputStream/io.Reader from OMElement object从 OMElement 对象获取 InputStream/io.Reader
【发布时间】:2012-01-03 13:07:37
【问题描述】:

我有一个OMElement 对象,我想从中获得一个InputStream 或阅读器对象。我想要的是从我拥有的OMElement 流式传输xml,而不会加载到内存中。我只能从中获得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解码时出错

【问题讨论】:

  • 请问,您是如何解决这个问题的?有示例代码吗?

标签: java xml axiom xmlstreamreader


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-07-24
    • 2017-10-06
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多