Skip to main content

By clicking Submit, you agree to the developerWorks terms of use.

The first time you sign into developerWorks, a profile is created for you. Select information in your profile (name, country/region, and company) is displayed to the public and will accompany any content you post. You may update your IBM account at any time.

All information submitted is secure.

  • Close [x]

The first time you sign in to developerWorks, a profile is created for you, so you need to choose a display name. Your display name accompanies the content you post on developerworks.

Please choose a display name between 3-31 characters. Your display name must be unique in the developerWorks community and should not be your email address for privacy reasons.

By clicking Submit, you agree to the developerWorks terms of use.

All information submitted is secure.

  • Close [x]

SAX, the power API

In this preview from XML by Example, compare DOM and SAX and then put SAX to work

Return to article


Listing 2. Cheapest.java

/*
 * XML By Example, chapter 8: SAX
 */

package com.psol.xbe2;

import org.xml.sax.*;
import java.io.IOException;
import org.xml.sax.helpers.*;
import java.text.MessageFormat;

/**
 * SAX event handler to find the cheapest offering in a list of
 * prices.
 */

public class Cheapest
   extends DefaultHandler
{
   /**
    * constants
    */
   protected static final String
      NAMESPACE_URI = "http://www.psol.com/xbe2/listing8.1",
      MESSAGE =
         "The cheapest offer is from {0} ({1,number,currency})",
      PARSER_NAME = "org.apache.xerces.parsers.SAXParser";

   /**
    * properties we are collecting: cheapest price & vendor
    */
   protected double min = Double.MAX_VALUE;
   protected String vendor = null;

   /**
    * startElement event: the price list is stored as price
    * elements with price and vendor attributes
    * @param uri namespace URI
    * @param name local name
    * @param qualifiedName qualified name (with prefix)
    * @param attributes attributes list
    */
   public void startElement(String uri,
                            String name,
                            String qualifiedName,
                            Attributes attributes)
   {
      if(uri.equals(NAMESPACE_URI) && name.equals("price-quote"))
      {
         String attribute =
            attributes.getValue("","price");
         if(null != attribute)
         {
            double price = toDouble(attribute);
            if(min > price)
            {
               min = price;
               vendor = attributes.getValue("","vendor");
            }
         }
      }
   }

   /**
    * helper method: turn a string in a double
    * @param string number as a string
    * @return the number as a double, or 0.0 if it cannot convert
    * the number
    */
   protected static final double toDouble(String string)
   {
      Double stringDouble = Double.valueOf(string);
      if(null != stringDouble)
         return stringDouble.doubleValue();
      else
         return 0.0;
   }

   /**
    * main() method
    * decodes command-line parameters and invoke the parser
    * @param args command-line argument
    * @throw Exception catch-all for underlying exceptions
    */
   public static void main(String[] args)
      throws IOException, SAXException
   {
      // command-line arguments
      if(args.length < 1)
      {
         System.out.println("java com.psol.xbe2.Cheapest file");
         return;
      }

      // creates the event handler
      Cheapest cheapest = new Cheapest();

      // creates the parser
      XMLReader parser =
         XMLReaderFactory.createXMLReader(PARSER_NAME);
      parser.setFeature("http://xml.org/sax/features/namespaces",
                        true);
      parser.setContentHandler(cheapest);

      // invoke the parser against the price list
      parser.parse(args[0]);

      // print the results
      Object[] objects = new Object[]
      {
          cheapest.vendor,
          new Double(cheapest.min)
      };
      System.out.println(MessageFormat.format(MESSAGE,objects));
   }
}

Return to article