Tutorials : Java and XML: putting SAX to work :

Contents
Why use XML?
Reading an XML file
Putting SAX to work
A complete event handler program for SAX
Sorting the data

A complete event handler program for SAX

The main program will build a linked list of DVD-instances. I've marked the code in bold that wasn't in the skeleton code above. I've also added some printing to System.out for every call-back method:

package hansen.playground;

import java.util.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;

public class MySAXParser extends DefaultHandler {
  static final String PARSER = "org.apache.xerces.parsers.SAXParser";
  List dvdList; // List of DVD's 
  List actorList; // List of actors
  String title; // DVD title 
  int length; // DVD length
  StringBuffer b = new StringBuffer(); // collects text
  
  public static void main(String[] args) {
    // main receives the name of an XML file 
    if (args.length > 0) {
      MySAXParser mp = new MySAXParser();
      try {
        mp.processFile(args[0]);
        mp.listDVDs();
      } catch (Exception e) {e.printStackTrace();};
    }
  }  
  
  public void processFile(String file) throws Exception {
    // Parse an XML file and 
    // return a list of dvd's
    dvdList = new LinkedList();
    XMLReader parser = XMLReaderFactory.createXMLReader(PARSER);
    parser.setContentHandler(this);
    parser.parse(file);
  }
  
  public void startElement(String uri, String localName, String qname, 
                           Attributes attributes) {
    System.out.println("startElement:" + qname);
    b.setLength(0); // empty character buffer
    if (qname.equals("dvd")) {
      actorList = new LinkedList();
    }  
  } 
  
  public void endElement(String uri, String localName, String qname) { 
    System.out.println("endElement:" + qname+":" + b.toString());
    if (qname.equals("title")) {
      title = b.toString();
    } else if (qname.equals("length")) {
      length = Integer.parseInt(b.toString());
    } else if (qname.equals("actor")) {
      String actor = b.toString();
      actorList.add(actor);
    } else if (qname.equals("dvd")) {
      dvdList.add(new DVD(title, length, actorList));       
    }  
    b.setLength(0); // empty character buffer
   
  }

  public void characters(char[] chars, int start, int length) { 
    // collect the characters
    System.out.println("characters:" + new String(chars, start, length));
    b.append(chars, start, length);
  }
  
  public void listDVDs() {
    // List DVD's on System.out
    for (Iterator i = dvdList.iterator(); i.hasNext();) {
      DVD dvd = (DVD)i.next();
      System.out.println(dvd.getTitle() + "/" + 
                         dvd.getLength() + "/" + dvd.getActors()); 
    }  
  }  

  public List getDVDs() {
    return dvdList;
  }
 
}

If we run the main method we'll see this written out to System.out:

	startElement:collection
	characters:
	  
	startElement:dvd
	characters:
	    
	startElement:title
	characters:Lord of the Rings: The Fellowship of the Ring
	endElement:title:Lord of the Rings: The Fellowship of the Ring
	characters:
	    
	startElement:length
	characters:178
	endElement:length:178
	characters:
	    
	startElement:actor
	characters:Ian Holm
	endElement:actor:Ian Holm
	characters:
	    
	startElement:actor
	characters:Elijah Wood
	endElement:actor:Elijah Wood
	characters:
	    
	startElement:actor
	characters:Ian McKellen
	endElement:actor:Ian McKellen
	characters:
	  
	endElement:dvd:
	
	. . . (continues)

As you can see we receive newline characters exactly like they're used in the XML-file. When the parse-method is completed, the "listDVDs" method is called, and it'll produce this output:

Lord of the Rings: The Fellowship of the Ring/178/Ian Holm, 
	Elijah Wood, Ian McKellen
The Matrix/136/Keanu Reeves, Laurence Fishburne
Amadeus/158/F. Murray Abraham, Tom Hulce, Elizabeth Berridge

Let's finish this article by adding a few enhancements--with no direct relation to XML--to the programs.

How to Add Java Applets to Your Site

New on the Java Boutique:

New Review:

Time Management Made Easy with the Quartz Enterprise Job Scheduler
Why not just use the Java timer API? This open source scheduling API boasts simplicity, ease-of-integration, a well-rounded feature set, and it's free!

New Applet:

Reverse Complement
Reverse Complement is a simple applet that converts DNA or RNA sequences into three useful formats.

Elsewhere on internet.com:

WebDeveloper Java
Lots of Java information on webdeveloper.com

WDVL Java
Thorough Java resource at the Web Developer's Virtual Library.

ScriptSearch Java
Hundreds of free Java code files to download.

jGuru: Your View of the Java Universe
Customizable portal with online training, FAQs, regular news updates, and tutorials.