2011-11-22 10 views
5

Ho un oggetto OMElement e da questo voglio ottenere un oggetto InputStream o lettore. Quello che voglio è lo streaming dello dello OMElement che ho, senza essere caricato in memoria. Potrei solo essere in grado di ottenere l'oggetto XMLStreamReader da quello. Ma non riesco a trovare un modo per ottenere InputStream/Reader da quello.Ottenere un InputStream/io.Reader dall'oggetto OMElement

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

Qualcuno può aiutarmi per favore? Ho davvero apprezzato!

Grazie

PS: Sono venuto un modo per ottenere un InputStream ma dà un'eccezione che ho bisogno di aiuto per risolverlo.

XMLStreamReader xmlReader = element.getXMLStreamReader(false); 

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

La chiamata getDataHandlerFromElement generare l'eccezione javax.xml.stream.XMLStreamException: errore durante la decodifica base64

+0

Posso sapere, come hai risolto questo problema? con un codice di esempio? – Ratha

risposta

2

Lo scopo del metodo è getDataHandlerFromElement per decodificare base64 dati codificati binari contenuti in un elemento, che non è quello che vuoi

Attualmente Axiom non ha un serializzatore di pull streaming (e non conosco altre librerie XML che supportano questo). Supporta solo la serializzazione in XML in modalità push, ovvero scrivendo su un OutputStream o Writer. È possibile eseguire la serializzazione in un thread separato e utilizzare un PipedOutputStream/PipedInputStream (simile a ciò che Activation fa per DataHandler # getInputStream() per un DataHandler che non è supportato da un DataSource). Ciò soddisfa il requisito di memoria costante, ma suppongo che il sovraccarico causato dall'utilizzo di un thread separato non sia accettabile nel tuo caso.

Ho pensato alla possibilità di implementare un serializzatore di tipo pull in passato, e penso che sia tecnicamente possibile farlo (senza usare un thread separato). Si prega di aprire un feature request for Axiom in modo che possiamo implementarlo in una delle prossime versioni. Penso che sarebbe un'aggiunta interessante per Axiom.