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));
}
}
|
