package org.akaza.openclinica.control.submit; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.Attributes; import org.xml.sax.SAXException; import org.xml.sax.helpers.DefaultHandler; import java.io.File; import java.io.IOException; import java.util.ArrayList; import java.util.HashMap; import java.util.Iterator; import java.util.List; import javax.xml.parsers.ParserConfigurationException; import javax.xml.parsers.SAXParser; import javax.xml.parsers.SAXParserFactory; /* * A simple xml parser based on SAX. This currently supports * flat data. * @author Krikor Krumlian */ public class XmlParser extends DefaultHandler { protected final Logger logger = LoggerFactory.getLogger(getClass().getName()); List<HashMap<String, String>> allCrfData; private HashMap<String, String> crfData; private String tempVal; public XmlParser() { allCrfData = new ArrayList<HashMap<String, String>>(); } public List<HashMap<String, String>> getData(File f) { parseDocument(f); printData(); return allCrfData; } private void parseDocument(File f) { // get a factory SAXParserFactory spf = SAXParserFactory.newInstance(); try { // get a new instance of parser SAXParser sp = spf.newSAXParser(); // parse the file and also register this class for call backs sp.parse(f, this); } catch (SAXException se) { se.printStackTrace(); } catch (ParserConfigurationException pce) { pce.printStackTrace(); } catch (IOException ie) { ie.printStackTrace(); } } /** * Iterate through the list and print the contents */ private void printData() { logger.info("No of Records '" + allCrfData.size() + "'."); Iterator it = allCrfData.iterator(); while (it.hasNext()) { logger.info(it.next().toString()); } } // Event Handlers @Override public void startElement(String uri, String localName, String qName, Attributes attributes) throws SAXException { // reset tempVal = ""; if (qName.equalsIgnoreCase("crf_data")) { crfData = new HashMap<String, String>(); } } @Override public void characters(char[] ch, int start, int length) throws SAXException { tempVal = new String(ch, start, length); } @Override public void endElement(String uri, String localName, String qName) throws SAXException { if (qName.equalsIgnoreCase("crf_data")) { // add it to the list allCrfData.add(crfData); } else if (qName.equalsIgnoreCase("data")) { // do nothing } else { crfData.put(qName, tempVal); } } }