5.5.4 サンプルプログラム(SampleSAX.java)

サンプルプログラムを次に示します。

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