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