Java HTML / XML How to - Flatten any xml record








Question

We would like to know how to flatten any xml record.

Answer

import java.io.IOException;
import java.io.StringReader;
import javax.xml.stream.XMLEventReader;
import javax.xml.stream.XMLInputFactory;
import javax.xml.stream.XMLStreamException;
import javax.xml.stream.events.XMLEvent;
//from www . ja  v a 2 s .c  o m
public class Main {
  private static XMLInputFactory inFactory = XMLInputFactory.newInstance();

  public static void main(String[] args) throws XMLStreamException, IOException {

    String xmlRecord = "<emplist>\n" + //
        "<emp>\n" + //
        "   <manager>\n" + //
        "   <id>1</id>\n" + //
        "   <name>foo</name>\n" + //
        "   </manager>\n" + //
        "</emp>\n" + //
        "<emp>\n" + //
        "   <clerk>\n" + //
        "   <cid>1</cid>\n" + //
        "   <cname>foo</cname>\n" + //
        "   </clerk>\n" + //
        "</emp>\n" + //
        " </emplist>";

    String flatXmlRecord = flattenXmlRecord(xmlRecord);
    System.out.print(flatXmlRecord);
  }

  private static String flattenXmlRecord(final String xmlRecord)
      throws XMLStreamException {
    StringBuilder flatXmlRecord = new StringBuilder();
    XMLEventReader eventReader = inFactory
        .createXMLEventReader(new StringReader(xmlRecord));
    while (eventReader.hasNext()) {
      XMLEvent event = eventReader.nextEvent();
      if (event.getEventType() != XMLEvent.START_ELEMENT) {
        continue;
      }
      String elementName = event.asStartElement().getName().getLocalPart();
      event = eventReader.nextEvent();
      if (event.getEventType() != XMLEvent.CHARACTERS) {
        continue;
      }
      if (event.asCharacters().getData().trim().isEmpty()) {
        continue;
      }
      flatXmlRecord.append(elementName + ", " + event.asCharacters().getData()
          + "\n");

    }
    return flatXmlRecord.toString();
  }
}