目次へ

2. XML文書を読む1

2005.11.30 株式会社四次元データ 宮澤了祐

2.1. イベントハンドラ

SAXはXMLファイルを先頭より解釈し、タグの開始等のイベントをハンドラに通知します。 イベントにはいくつか種類があり、同じ数だけイベントを受け取るハンドラが存在します。 SAXで発生するイベントとそれを受信するハンドラのインタフェース一覧です。

イベントの種類 インタフェース名
エンティティ宣言の開始、終了 EntityResolver
エンティティが発生した際に呼ばれます。
DTD宣言の通知、解析出来ないDTDの発生 DTDHandler
DTD関連のイベントを受け取ります。
タグの開始、タグの終了など ContentHandler
文書のコンテンツ関連のイベントを受け取ります。
解析出来ない時 ErrorHandler
XMLの構文がおかしい場合などに発生するエラーイベントを受け取ります。

これらのインタフェースを標準的な形で実装したのが、 org.xml.sax.helpers.DefaultHandler です。 DefaultHandlerは上記の全ての種類のイベントを受け取ることが出来ます。
もしそれぞれを実装して用いるのであれば、以下のようにしてSAXパーサーにイベントハンドラを登録します。 SAXParserがラップしているXMLReaderを使用します。

SAXParserFactory spfactory = SAXParserFactory.newInstance();
XMLReader reader = spfactory.newSAXParser().getXMLReader();

reader.setDocumentHandler(myDocumentHandler); 
reader.setDTDHandler(myDTDHandler);
reader.setEntityResolver(myEntityResolver) 
reader.setErrorHandler(myErrorHandler) 

reader.parse("hogehoge.xml");

javax.xml.parsers.SAXParserを使用する場合は、各イベントハンドラを実装したDefaultHandlerをイベントハンドラの対象とします。

2.2. 要素の取得

次のようなXML文書をSAXで解析するとします。

<?xml version="1.0" encoding="euc-jp" ?>
<root>
    <text>Hello SAX!!!</text>
</root>

要素の開始はDefaultHandlerのstartElement()メソッドで、要素の終了はDefaultHandler.endElement()メソッドで受け取ります。 またボディ部のテキストはDefaultHandler.characters()メソッドで受け取ることが出来ます。

public void startElement(String uri,String localName,String qName,Attributes attributes) {
    System.out.println("要素開始:" + qName);
}
public void endElement(String uri,String localName,String qName) {
    System.out.println("要素終了:" + qName);
}
public void characters(char[] ch,int offset,int length) {
    System.out.println("テキストデータ:" + new String(ch, offset, length));
}

startElemtnt()メソッド及びendElement()メソッドの第三引数に、要素名が入っています。 characters()メソッドの第一引数に文字バッファが、第二引数に文字配列内の開始位置が、第三引数に文字の長さが入っています。 次のように出力されれば成功です。

要素開始:root
要素開始:text
テキストデータ:Hello SAX!!!
要素終了:text
要素終了:root

↑このページの先頭へ

こちらもチェック!

PR
  • XMLDB.jp