import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import java.io.*;

// A Simple SAX Application using JAXP with Namespace support
public class SaxMap{
	private SAXParserFactory factory; // Creates parser object
	private SAXParser saxParser; // Holds a parser object
	private DefaultHandler handler; // Defines the handler for this parser
	
	public SaxMap() 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);
		} 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);
            }
			SaxMap xmlApp = new SaxMap();
			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){
			/*
				When a start tag is found, reset the buffer. This clears out 
				any previous data we do not need and starts storing the text 
				for this element.
			*/
			buff.reset();
		}
		
		public void characters(char[] ch, int start, int length){
			// Store text in a buffer
			buff.write(ch, start, length);
		}

		public void endElement(String uri, String local, String qName){
			// Pick out the specific tags you are looking for
			
			if (local.equals("name")){
				System.out.println("Name: " + buff.toString());
			}
			
			if (local.equals("phone")){
				System.out.println("Phone #: " + buff.toString());
			}
		}
		
	}
}

