2011-11-22 11 views
5

Mam obiekt OMElement iz tego chcę uzyskać obiekt InputStream lub czytnik. To, czego chcę, to przesyłać strumieniowo xml z posiadanego przeze mnie, OMElement, bez pobierania do pamięci. Mogę tylko uzyskać obiekt od tego obiektu XMLStreamReader. Ale nie mogę znaleźć sposobu, aby uzyskać z tego InputStream/Reader.Uzyskaj InputStream/io.Reader z obiektu OMElement

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

Czy ktoś może mi pomóc? Naprawdę doceniam!

Dzięki

PS: Ja przyszedłem sposób, aby uzyskać InputStream ale daje wyjątek które potrzebują pomocy, aby go rozwiązać.

XMLStreamReader xmlReader = element.getXMLStreamReader(false); 

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

Wywołanie getDataHandlerFromElement wygenerowania wyjątku javax.xml.stream.XMLStreamException: Błąd podczas dekodowania base64

+0

Czy mogę wiedzieć, jak udało ci się przezwyciężyć ten problem? z przykładowym kodem? – Ratha

Odpowiedz

2

Celem sposobu getDataHandlerFromElement jest BASE64 dekodowania zakodowanych danych binarnych zawartych w elemencie co nie jest tym, czego chcesz.

Aksjomat obecnie nie ma serializatora ściągania strumieniowego (i nie znam żadnej innej biblioteki XML, która obsługuje to). Obsługuje tylko serializację do XML w trybie push, tj. Zapisywanie do OutputStream lub Writer. Możesz dokonać serializacji w osobnym wątku i użyć PipedOutputStream/PipedInputStream (podobnego do tego, co robi Aktywacja dla DataHandler # getInputStream() dla DataHandler, który nie jest wspierany przez DataSource). Spełniałoby to wymaganie stałej pamięci, ale przypuszczam, że narzut związany z używaniem oddzielnego wątku nie byłby w twoim przypadku do przyjęcia.

Pomyślałem o możliwości zastosowania takiego serializera w przeszłości i myślę, że jest to technicznie wykonalne (bez użycia osobnego wątku). Proszę otworzyć feature request for Axiom, abyśmy mogli wprowadzić to w jednym z kolejnych wydań. Myślę, że byłby to ciekawy dodatek do aksjomatu.