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.
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.
|