SAXDemo.java Source code

Java tutorial

Introduction

Here is the source code for SAXDemo.java

Source

/*
 * Copyright (c) 2000 David Flanagan.  All rights reserved.
 * This code is from the book Java Examples in a Nutshell, 2nd Edition.
 * It is provided AS-IS, WITHOUT ANY WARRANTY either expressed or implied.
 * You may study, use, and modify it for any non-commercial purpose.
 * You may distribute it non-commercially as long as you retain this notice.
 * For a commercial use license, or to purchase the book (recommended),
 * visit http://www.davidflanagan.com/javaexamples2.
 */

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

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

import org.xml.sax.AttributeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.SAXParseException;

/**
 * 
 * This class implements the HandlerBase helper class, which means that it
 * defines all the "callback" methods that the SAX parser will invoke to notify
 * the application. In this example we override the methods that we require.
 * 
 * This example uses full package names in places to help keep the JAXP and SAX
 * APIs distinct.
 */
public class SAXDemo extends org.xml.sax.HandlerBase {
    /** The main method sets things up for parsing */
    public static void main(String[] args) throws IOException, SAXException, ParserConfigurationException {
        // Create a JAXP "parser factory" for creating SAX parsers
        javax.xml.parsers.SAXParserFactory spf = SAXParserFactory.newInstance();

        // Configure the parser factory for the type of parsers we require
        spf.setValidating(false); // No validation required

        // Now use the parser factory to create a SAXParser object
        // Note that SAXParser is a JAXP class, not a SAX class
        javax.xml.parsers.SAXParser sp = spf.newSAXParser();

        // Create a SAX input source for the file argument
        org.xml.sax.InputSource input = new InputSource(new FileReader(args[0]));

        // Give the InputSource an absolute URL for the file, so that
        // it can resolve relative URLs in a <!DOCTYPE> declaration, e.g.
        input.setSystemId("file://" + new File(args[0]).getAbsolutePath());

        // Create an instance of this class; it defines all the handler methods
        SAXDemo handler = new SAXDemo();

        // Finally, tell the parser to parse the input and notify the handler
        sp.parse(input, handler);

        // Instead of using the SAXParser.parse() method, which is part of the
        // JAXP API, we could also use the SAX1 API directly. Note the
        // difference between the JAXP class javax.xml.parsers.SAXParser and
        // the SAX1 class org.xml.sax.Parser
        //
        // org.xml.sax.Parser parser = sp.getParser(); // Get the SAX parser
        // parser.setDocumentHandler(handler); // Set main handler
        // parser.setErrorHandler(handler); // Set error handler
        // parser.parse(input); // Parse!
    }

    StringBuffer accumulator = new StringBuffer(); // Accumulate parsed text

    String servletName; // The name of the servlet

    String servletClass; // The class name of the servlet

    String servletId; // Value of id attribute of <servlet> tag

    // When the parser encounters plain text (not XML elements), it calls
    // this method, which accumulates them in a string buffer
    public void characters(char[] buffer, int start, int length) {
        accumulator.append(buffer, start, length);
    }

    // Every time the parser encounters the beginning of a new element, it
    // calls this method, which resets the string buffer
    public void startElement(String name, AttributeList attributes) {
        accumulator.setLength(0); // Ready to accumulate new text
        // If its a servlet tag, look for id attribute
        if (name.equals("servlet"))
            servletId = attributes.getValue("id");
    }

    // When the parser encounters the end of an element, it calls this method
    public void endElement(String name) {
        if (name.equals("servlet-name")) {
            // After </servlet-name>, we know the servlet name saved up
            servletName = accumulator.toString().trim();
        } else if (name.equals("servlet-class")) {
            // After </servlet-class>, we've got the class name accumulated
            servletClass = accumulator.toString().trim();
        } else if (name.equals("servlet")) {
            // Assuming the document is valid, then when we parse </servlet>,
            // we know we've got a servlet name and class name to print out
            System.out.println("Servlet " + servletName + ((servletId != null) ? " (id=" + servletId + ")" : "")
                    + ": " + servletClass);
        }
    }

    /** This method is called when warnings occur */
    public void warning(SAXParseException exception) {
        System.err.println("WARNING: line " + exception.getLineNumber() + ": " + exception.getMessage());
    }

    /** This method is called when errors occur */
    public void error(SAXParseException exception) {
        System.err.println("ERROR: line " + exception.getLineNumber() + ": " + exception.getMessage());
    }

    /** This method is called when non-recoverable errors occur. */
    public void fatalError(SAXParseException exception) throws SAXException {
        System.err.println("FATAL: line " + exception.getLineNumber() + ": " + exception.getMessage());
        throw (exception);
    }
}

// Sample XML file

/*
 * <?xml version="1.0" encoding="ISO-8859-1"?>
 * 
 * <web> <s id="hello_servlet_id"> <name>hello </name> <class>Hello </class>
 * </s>
 * 
 * </web>
 *  
 */