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