Skip to content

Instantly share code, notes, and snippets.

@shvalb
Created July 29, 2016 14:44
Show Gist options
  • Select an option

  • Save shvalb/ca9cd526aea31ccf280adf289e0991d7 to your computer and use it in GitHub Desktop.

Select an option

Save shvalb/ca9cd526aea31ccf280adf289e0991d7 to your computer and use it in GitHub Desktop.
Async Parsing XML using Aalto-XML
import javax.xml.stream.*;
import javax.xml.stream.events.*;
import com.fasterxml.aalto.*;
import com.fasterxml.aalto.stax.*;
import io.vertx.core.buffer.*;
public class XMLParser {
private AsyncXMLInputFactory xmlInputFactory = new InputFactoryImpl();
private AsyncXMLStreamReader<AsyncByteArrayFeeder> streamReader = xmlInputFactory.createAsyncForByteArray();
public rx.Observable<XMLStreamEvent> parse(Buffer data) {
byte[] bytes = data.getBytes();
final int bufSize = data.length();
try {
streamReader.getInputFeeder().feedInput(bytes, 0, bufSize);
} catch (XMLStreamException e) {
return rx.Observable.error(e);
}
// consume all data
return rx.Observable.create(subscriber -> {
try {
while (streamReader.hasNext()) {
// read next token
int event=-1;
try {
event = streamReader.next();
} catch (Exception e) {
subscriber.onError(e);
break;
}
if (event == AsyncXMLStreamReader.EVENT_INCOMPLETE) {
// create stream event
XMLStreamEvent e = new XMLStreamEvent(event, streamReader);
subscriber.onNext(e);
// wait for more input
break;
}
if(event == XMLEvent.END_ELEMENT && streamReader.getLocalName().equals("TutorResult")) {
streamReader.getInputFeeder().endOfInput();
// Prepare for next xml file.
}
// create stream event
XMLStreamEvent e = new XMLStreamEvent(event, streamReader);
subscriber.onNext(e);
if(event == XMLEvent.END_DOCUMENT) {
streamReader = xmlInputFactory.createAsyncForByteArray();
}
}
} catch (XMLStreamException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
});
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment