package com.joe.utilities.core.util; import java.io.StringWriter; import javax.xml.stream.XMLOutputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; import javax.xml.stream.XMLStreamWriter; /** * The Class XMLStreamElementReader. * Abstraction above an XMLStreamReader which return a targeted element on the given stream. * For a given block of XML * * <file> * <record... </record> * <record... </record> * <record... </record> * </file> * * This method can read/iterate retrieving the "<record... </record>" elements */ public class XMLStreamElementReader { /** The underlying stax xml reader. */ private XMLStreamReader staxXmlReader; /** The element name. */ private String elementName; /** * Instantiates a new xML stream element reader. * * @param staxXmlReader the stax xml reader * @param elementName the element name */ public XMLStreamElementReader(XMLStreamReader staxXmlReader, String elementName) { this.staxXmlReader = staxXmlReader; this.elementName = elementName; } /** * Next. * * @return the string * @throws XMLStreamException the xML stream exception */ public String next() throws XMLStreamException { for (int event = staxXmlReader.next(); event != XMLStreamConstants.END_DOCUMENT; event = staxXmlReader.next()) { if (event == XMLStreamConstants.START_ELEMENT) { // Located start element if (staxXmlReader.getLocalName().equals(elementName)) { // Copy contents of StringWriter xmlStringWriter = new StringWriter(256); XMLOutputFactory factory = XMLOutputFactory.newInstance(); XMLStreamWriter staxXmlWriter = factory.createXMLStreamWriter(xmlStringWriter); StaxUtils.copyCurrentElement(staxXmlReader, staxXmlWriter); return xmlStringWriter.toString(); } } } return null; } /** * Close underlying reader * * @throws XMLStreamException the xML stream exception */ public void close() throws XMLStreamException { if (staxXmlReader!=null) staxXmlReader.close(); } }