Saturday, December 31, 2011

XML parsing in java example using SAX


SAX parsing is event based modelling.When a Sax parser parses a XML document,  it generates call back events as it encounters start-tags, end-tags, text, comments and so on. The class DefaultHandler is the base class to listen such events. It contains methods to handle respective events. For example, 

when it encounters a Start Tag it calls method
    public void startElement()
when it encounters a End Tag it calls this method
    public void endElement()


Source Code : 
package com.manoj.examples.xml;

import java.io.FileReader;
import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import org.xml.sax.helpers.XMLReaderFactory;

/**
 * The Class XMLParserSAX.
 * @author Manoj Shrestha
 * @contact m.javaprogrammer@gmail.com
 */
public class XMLParserSAX extends DefaultHandler {
      private static final String QUOTE = "\"";

      public static void main(String args[]) throws Exception {
            try {
                  // get a new instance of parser
                  SAXParser sp = SAXParserFactory.newInstance().newSAXParser();
                  // parse the file and also register this class for call backs
                  // The file name is relative to the main project folder
                  sp.parse("Personnel.xml", new XMLParserSAX());

            } catch (ParserConfigurationException e) {
                  e.printStackTrace();
            } catch (SAXException e) {
                  e.printStackTrace();
            } catch (IOException e) {
                  e.printStackTrace();
            }
           
            // Another way to parse XML through XMLReader
            /**
                  FileReader fileReader = new FileReader("Personnel.xml");
                  XMLReader xr = XMLReaderFactory.createXMLReader();
                  xr.setContentHandler(new XMLParserSAX());
                  xr.parse(new InputSource(fileReader));
            **/
      }

      @Override
      public void startDocument() {
            System.out.println("Start document");
      }

      @Override
      public void endDocument() {
            System.out.println("End document");
      }

      @Override
      public void startElement(String uri, String name, String qName,
                  Attributes atts) {
            if ("".equals(uri))
                  System.out.print("Start element: " + qName);
            else
                  System.out.print("Start element: {" + uri + "}" + name);

            if (atts.getLength() > 0) {
                  System.out.print(" Attributes : ");
                  for (int i = 0; i < atts.getLength(); i++) {
                        System.out.print(atts.getLocalName(i) + " = " + QUOTE
                                    + atts.getValue(i) + QUOTE + " ");

                  }
            }
            System.out.println();
      }

      @Override
      public void endElement(String uri, String name, String qName) {
            if ("".equals(uri))
                  System.out.println("End element: " + qName);
            else
                  System.out.println("End element:   {" + uri + "}" + name);
      }

      @Override
      public void characters(char ch[], int start, int length) {
            System.out.print("Characters:    \"");
            for (int i = start; i < start + length; i++) {
                  switch (ch[i]) {
                  case '\\':
                        System.out.print("\\\\");
                        break;
                  case '"':
                        System.out.print("\\\"");
                        break;
                  case '\n':
                        System.out.print("\\n");
                        break;
                  case '\r':
                        System.out.print("\\r");
                        break;
                  case '\t':
                        System.out.print("\\t");
                        break;
                  default:
                        System.out.print(ch[i]);
                        break;
                  }
            }
            System.out.print("\"\n");
      }
}




The input file : “Personnel.xml”
<?xml version="1.0" encoding="UTF-8"?>
<Personnel>
      <Employee type="permanent" id="p124">
            <Name>Manoj Shrestha</Name>
            <Age>25</Age>
            <Address>Tokyo</Address>
      </Employee>
      <Employee type="contract" id="c230">
            <Name>Lionel Messi</Name>
            <Age>24</Age>
            <Address>Barcelona</Address>
      </Employee>
</Personnel>

The console output :
Start document
Start element: Personnel
Characters:    "\n\t"
Start element: Employee Attributes : type = "permanent" id = "p124"
Characters:    "\n\t\t"
Start element: Name
Characters:    "Manoj Shrestha"
End element: Name
Characters:    "\n\t\t"
Start element: Age
Characters:    "25"
End element: Age
Characters:    "\n\t\t"
Start element: Address
Characters:    "Tokyo"
End element: Address
Characters:    "\n\t"
End element: Employee
Characters:    "\n\t"
Start element: Employee Attributes : type = "contract" id = "c230"
Characters:    "\n\t\t"
Start element: Name
Characters:    "Lionel Messi"
End element: Name
Characters:    "\n\t\t"
Start element: Age
Characters:    "24"
End element: Age
Characters:    "\n\t\t"
Start element: Address
Characters:    "Barcelona"
End element: Address
Characters:    "\n\t"
End element: Employee
Characters:    "\n"
End element: Personnel
End document


No comments :

Post a Comment