Получить InputStream / io.Reader из объекта OMElement - PullRequest
5 голосов
/ 22 ноября 2011

У меня есть объект 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 Ответ

2 голосов
/ 24 ноября 2011

Цель метода getDataHandlerFromElement - декодировать двоичные данные в кодировке base64, содержащиеся в элементе, а это не то, что вам нужно.

В настоящее время у Axiom нет сериализатора потоковой передачи (и я не знаю какой-либо другой библиотеки XML, поддерживающей это). Он поддерживает сериализацию в XML только в режиме push, то есть путем записи в OutputStream или Writer. Вы можете выполнить сериализацию в отдельном потоке и использовать PipedOutputStream / PipedInputStream (аналогично тому, что Activation делает для DataHandler # getInputStream () для DataHandler, который не поддерживается источником данных). Это удовлетворяло бы постоянное требование к памяти, но я предполагаю, что издержки, вызванные использованием отдельного потока, не были бы приемлемы в вашем случае.

В прошлом я думал о возможности реализовать такой сериализатор по запросу, и я думаю, что это технически возможно (без использования отдельного потока). Пожалуйста, откройте запрос для Axiom , чтобы мы могли реализовать его в одном из следующих выпусков. Я думаю, что это было бы интересным дополнением к Аксиоме.

...