import javax.xml.parsers.*;		// Includes SAXParser and SAXParserFactory
import org.xml.sax.*;  			// Needed for SAXException
import org.xml.sax.helpers.*; 	// Needed to include the DefaultHandler
import java.io.*;

// A Simple SAX Application using JAXP with Namespace support
public class MyParser{
	private SAXParserFactory factory; // Creates parser factory
	private SAXParser saxParser; // Holds a parser object

	private DefaultHandler handler; // Defines the handler for this parser
	
	public MyParser() throws SAXException{
		try{
			factory = SAXParserFactory.newInstance();
		    factory.setNamespaceAware(true);	    
			saxParser = factory.newSAXParser();
						
			// Set Content Handlers
			handler = new MyDefaultHandler();
			
		} catch (ParserConfigurationException e){
			e.printStackTrace();
		} catch (SAXException e){
			e.printStackTrace();
		}
	}
	
	public void parseDocument(String xmlFile){
		try{
			saxParser.parse(xmlFile, handler); // Parses file using handler
		} catch (SAXException e){
			e.printStackTrace();
		} catch (IOException e){
			e.printStackTrace();
		} catch (Exception e){
			e.printStackTrace();
		}
	}
	
	public static void main(String[] args){
        try {
            if (args.length != 1) {
                System.out.println(
                    "Usage: java SimpleJAXPns " +
                    "[XML Document Filename]");
                System.exit(0);
            }
			MyParser xmlApp = new MyParser();
			xmlApp.parseDocument(args[0]);
        } catch (SAXException e){
			e.printStackTrace();
		} catch (Exception e) {
            e.printStackTrace();
        }
	}
	
	class MyDefaultHandler extends DefaultHandler{
		private CharArrayWriter buff = new CharArrayWriter();
		/* With a handler class, just override the methods you need to use
		*/
		public void startElement(String uri, String local, String qName, Attributes att){
			System.out.println("== Started element ==");
			System.out.println("Local name: " + local);
			System.out.println("Qname: " + qName);
		}
		
		public void characters(char[] ch, int start, int length){
			buff.write(ch, start, length);
			
			// Skip spaces and end of line markers
			// A bit of a hack. Will switch to a RegEx in the future
			if (buff.size() > 3){
				System.out.println("Element Data: " + buff.toString());
			}
			buff.reset();
		}

		public void endElement(String uri, String local, String qName){
			System.out.println("Ended element: " + local);
		}
		
	}
}

