サンプルプログラムを次に示します。
import javax.xml.parsers.*;
import org.xml.sax.*;
import org.xml.sax.helpers.*;
import org.xml.sax.SAXException;
import java.io.*;
public class SampleSAX{
public static final void main(String[] args){
try{
SAXParserFactory factory = SAXParserFactory.newInstance();
SAXParser parser = factory.newSAXParser();
String xml = "SampleSAX.xml";
DefaultHandler handler = new EventHandler();
parser.parse(xml, handler);
}catch(ParserConfigurationException e){
e.printStackTrace();
}catch(IOException e){
e.printStackTrace();
}catch(SAXException e){
e.printStackTrace();
}
}
}
//合計金額を計算して出力する
class EventHandler extends DefaultHandler{
int tvPrice; //テレビ単価
int radioPrice; //ラジオ単価
int videoPrice; //ビデオ単価
int tvNum; //テレビ数量
int radioNum; //ラジオ数量
int videoNum; //ビデオ数量
boolean tvFlag; //テレビ用フラグ
boolean radioFlag; //ラジオ用フラグ
boolean videoFlag; //ビデオ用フラグ
boolean tankaFlag; //単価タグ内用フラグ
boolean volFlag; //数量タグ内用フラグ
boolean nameFlag; //商品名タグ内用フラグ
String str; //要素内容の文字列
StringBuffer buffer; //要素内容の文字列連結用バッファ
//XMLの開始通知イベント
public void startDocument(){
tvPrice = 0;
radioPrice = 0;
videoPrice = 0;
tvNum = 0;
radioNum = 0;
videoNum = 0;
tvFlag = false;
radioFlag = false;
videoFlag = false;
tankaFlag = false;
volFlag = false;
nameFlag = false;
}
//XMLの終了通知イベント
public void endDocument(){
int sum = tvNum * tvPrice + radioNum * radioPrice +
videoNum * videoPrice;
System.out.println("合計は" + sum + "円です。");
}
//エレメント開始(タグの開始)通知イベント
public void startElement(String nameSpace, String localName,
String modName, Attributes attr){
buffer = new StringBuffer();
if(modName.equals("単価")){
tankaFlag = true;
}
if(modName.equals("数量")){
volFlag = true;
}
if(modName.equals("商品名")){
nameFlag = true;
}
}
//エレメント終了(タグの終了)通知イベント
public void endElement(String nameSpace, String localName,
String modName){
str = buffer.toString();
if(nameFlag == true){
if(str.equals("テレビ")){
tvFlag = true;
}
if(str.equals("ラジオ")){
radioFlag = true;
}
if(str.equals("ビデオ")){
videoFlag = true;
}
}else if(tvFlag == true){
if(tankaFlag == true){
//テレビの単価をセット
tvPrice = Integer.parseInt(str);
}else if(volFlag == true){
//テレビの数量をセット
tvNum = Integer.parseInt(str);
}
}else if(radioFlag == true){
if(tankaFlag == true){
//ラジオの単価をセット
radioPrice = Integer.parseInt(str);
}else if(volFlag == true){
//ラジオの数量をセット
radioNum = Integer.parseInt(str);
}
}else if(videoFlag == true){
if(tankaFlag == true){
//ビデオの単価をセット
videoPrice = Integer.parseInt(str);
}else if(volFlag == true){
//ビデオの数量をセット
videoNum = Integer.parseInt(str);
}
}
if(modName.equals("単価")){
tankaFlag = false;
}
if(modName.equals("数量")){
volFlag = false;
}
if(modName.equals("商品名")){
nameFlag = false;
}
if(modName.equals("商品")){
tvFlag = false;
radioFlag = false;
videoFlag = false;
}
}
//文字列通知イベント
public void characters(char[] ch, int start, int length){
buffer.append(ch, start, length);
}
}