倭マン's BLOG

くだらない日々の日記書いてます。 たまにプログラミング関連の記事書いてます。 書いてます。

org.xml.sax.ContentHandler, org.xml.sax.helpers.DefaultHandler

前回あたりから既に javax.xml.parsers パッケージから離れてますが、気にせずいきましょう(記事一覧)。

org.xml.sax.ContentHandler インターフェース


SAX イベントを扱うハンドラの中で必須のインターフェース、org.xml.sax.ContentHandler に定義されているメソッドを見ていきます。 ContentHandler インターフェースの定義は以下のようになっています:

public interface ContentHandler{

    void setDocumentLocator(Locator locator);

    void startDocument() throws SAXException;
    void endDocument() throws SAXException;

    void startPrefixMapping(String prefix, String uri) throws SAXException;
    void endPrefixMapping(String prefix) throws SAXException;

    void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException;
    void endElement(String uri, String localName, String qName) throws SAXException;

    void characters(char[] ch, int start, int length) throws SAXException;

    void processingInstruction(String target, String data) throws SAXException;
    void ignorableWhitespace(char[] ch, int start, int length) throws SAXException;
    void skippedEntity(String name) throws SAXException;
}

各メソッドを簡単に見ていきましょう:

メソッド名 説明
setDocumentLocator(..) 各 SAX 解析の実行に付随する org.xml.sax.Locator オブジェクトをセットします。 この Locator オブジェクトを用いると、SAX 解析時に、入力された XML 文書のどの位置を解析しているかという位置情報を取得することができます。 特に、文書の読み込みに失敗したときなどにこの位置情報を使用するとよいでしょう。 このメソッドは SAX 解析開始直後に最初に呼び出されます。
startDocument() XML 文書の解析が開始する際(setDocumentLocator(..) の後)に呼び出されます。
endDocument() XML 文書の解析が終了する際に呼び出されます。
startPrefixMapping(..) 要素の解析が開始する際、その要素に名前空間宣言があれば、その接頭辞と URI を引数にしてこのメソッドが呼び出されます。 このメソッドが呼び出されるタイミングは startElement(..) メソッドの呼び出しの直前です。
endPrefixMapping(..) 要素の解析が終了する際、その要素に名前空間宣言があれば、その接頭辞引数にしてこのメソッドが呼び出されます。 このメソッドが呼び出されるタイミングは endElement(..) メソッドの呼び出しの直後です。
startElement(..) 要素の解析が開始する際に呼び出されます。
endElement(..) 要素の解析が終了する際に呼び出されます。
characters(..) テキストが現れた際に呼び出されます。 エスケープ文字 (&lt;, &gt;, &apos; &quot;, &amp;) は通常の文字 (<, >, ', ", &) に変換されて渡されます(CDATA セクション内の文字はそのまま)*1。 一見一続きのテキストでも、分割されて渡されれることがあるので注意しましょう*2
processingInstruction(..) 略。
ignorableWhitespace(..) *3
skippedEntity(..) 略。

org.xml.sax.helpers.DefaultHandler クラス


ContentHandler の実装クラスを作成する際、全てのメソッドを実装するのは面倒なので、通常はそのサポートクラス DefaultHandler クラスを拡張して用います。 このクラスは ContentHandler の全てのメソッドを実装している(ただし、呼び出されても何もしない)ので、処理を実装したいメソッドをオーバーライドするだけで済みます。

SAXParser#parse(..) メソッドには ContentHandler ではなく DefaultHandler を渡さなければならないので、SAXParser を使用する場合は、DefaultHandler を使用する必要があります。

*1:これらは SAXParser などの設定や実装によるかもしれません

*2:エスケープ文字や実体参照、 CDATA セクションがあれば、大抵そこで分割されます。

*3:空白が無視できるかどうかは DTD やその他のスキーマ定義をもとに判断されます。 したがって、妥当性検証が行われない場合は、このメソッドは呼び出されません。 すべて characters() メソッドに渡されます。