@XmlRootElement
public class Book {
// TODO: getters/setters
public String author;
public String title;
}
Assuming you want to process data as strongly typed objects you can combine StAX and JAXB using utility types:
class ContentFinder implements StreamFilter {
private boolean capture = false;
@Override
public boolean accept(XMLStreamReader xml) {
if (xml.isStartElement() && "book".equals(xml.getLocalName())) {
capture = true;
} else if (xml.isEndElement() && "book".equals(xml.getLocalName())) {
capture = false;
return true;
}
return capture;
}
}
class Limiter extends StreamReaderDelegate {
Limiter(XMLStreamReader xml) {
super(xml);
}
@Override
public boolean hasNext() throws XMLStreamException {
return !(getParent().isEndElement()
&& "book".equals(getParent().getLocalName()));
}
}
Usage:
XMLInputFactory inFactory = XMLInputFactory.newFactory();
XMLStreamReader reader = inFactory.createXMLStreamReader(inputStream);
reader = inFactory.createFilteredReader(reader, new ContentFinder());
Unmarshaller unmar = JAXBContext.newInstance(Book.class)
.createUnmarshaller();
Transformer tformer = TransformerFactory.newInstance().newTransformer();
while (reader.hasNext()) {
XMLStreamReader limiter = new Limiter(reader);
Source src = new StAXSource(limiter);
DOMResult res = new DOMResult();
tformer.transform(src, res);
Book book = (Book) unmar.unmarshal(res.getNode());
System.out.println(book.title);
}