Hitachi

Cosminexus V11 アプリケーションサーバ Cosminexus XML Processor ユーザーズガイド


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