2011-11-22 13 views
5

Tengo un objeto OMElement y de eso quiero obtener un objeto InputStream o lector. Lo que quiero es transmitir el xml desde el OMElement que tengo, sin cargar en la memoria. Solo podría obtener el objeto XMLStreamReader a partir de eso. Pero no puedo encontrar una forma de obtener InputStream/Reader de eso.Obtener un InputStream/io.Reader del objeto OMElement

OMElement element /*I have this object */ 
XMLStreamReader xmlreader = element.getXMLStreamReaderWithoutCaching(); 

¿Alguien puede ayudarme? ¡Realmente lo aprecio!

Gracias

PS: Yo he llegado una manera de conseguir un InputStream pero da una excepción que necesito ayuda para resolverlo.

XMLStreamReader xmlReader = element.getXMLStreamReader(false); 

    try { 
     if (xmlReader.getEventType() == XMLStreamReader.START_DOCUMENT) { 
       xmlReader.next(); 
     } 
     DataHandler handler = XMLStreamReaderUtils.getDataHandlerFromElement(xmlReader); 
     handler.getInputStream(); 

La llamada a getDataHandlerFromElement generar la excepción javax.xml.stream.XMLStreamException: Error durante la decodificación base64

+0

Lo sé, ¿cómo superaste este problema? con un código de muestra? – Ratha

Respuesta

2

El propósito del método getDataHandlerFromElement es decodificar base64 codificado datos binarios contenidos en un elemento, que no es lo que quieres

Actualmente Axiom no tiene un serializador de extracción de transmisión (y no conozco ninguna otra biblioteca XML que admita esto). Solo admite la serialización a XML en modo push, es decir, escribiendo en OutputStream o Writer. Podría hacer la serialización en un hilo separado y usar un PipedOutputStream/PipedInputStream (similar a lo que hace la Activación para DataHandler # getInputStream() para un DataHandler que no está respaldado por un DataSource). Esto satisfaría el requisito de memoria constante, pero supongo que la sobrecarga causada por el uso de un hilo separado no sería aceptable en su caso.

Pensé en la posibilidad de implementar un serializador de extracción de este tipo en el pasado, y creo que es técnicamente posible hacerlo (sin utilizar un hilo separado). Abra un feature request for Axiom para que podamos implementarlo en uno de los próximos lanzamientos. Creo que sería una adición interesante a Axiom.

Cuestiones relacionadas