Home of: [工房 "藤車"] > [SourceForge.net における SASAX]

解析におけるフック

本節では、 SASAX による XML 文書解析におけるユーティリティ機能について説明します。

本節でのトピックは:

要素内容確定の通知

ほぼ全ての "Elemenet" 実装の基底クラスである "AbstractElement" は、 要素の内容が確定した際に起動される "notifyDetermined(ParseContext)" メソッドを持っています。

例えば、 以下に示すようなコードで notifyDetermined(ParseContext) をオーバライドすることで、 "composite" 要素の挙動を拡張することが出来ます。


CompositeElement compositeElement =
    new CompositeElement(null, uri, "composite"){
        protected void notifyDetermined(ParseContext context){
            // '</composite>' における処理を記述
        }
    };

notifyDetermined(ParseContext) のオーバライド

要素の開始/終了の通知

要素の開始/終了の通知を受け取るために、 SASAX は "Notification" インタフェースを提供しています。


public interface Notification
{
    public void elementStarted(Element element,
                               ParseContext context,
                               Attributes attributes)
        throws SAXException;

    public void elementEnded(Element element,
                             ParseContext context)
        throws SAXException;
}

Notification インタフェース

AbstractElement" は、 指定された Notification をイベント受信希望リストに登録する "addNotification()" メソッドを持っています。

登録された Notification は、 対応する要素の開始/終了時に起動されます。 例えば、 以下のようなコードにより、 "composite" 要素の開始/終了を受け取ることが出来ます。


compositeElement.addNotification(new Notification(){
    public void elementStarted(Element element,
                               ParseContext context,
                               Attributes attributes)
        throws SAXException
    {
        // '<composite>' における処理をここに書く
    }

    public void elementEnded(Element element,
                             ParseContext context)
        throws SAXException
    {
        // '</composite>' における処理をここに書く
    }
});

Notification の登録

elementEnded()notifyDetermined(ParseContext) の起動と同じ契機で起動されますので、 殆ど全ての実装は NotificationelementEnded() に置くことが出来ます。

属性の監視

注意: この節で説明されている機能は、SASAX 1.5 以降で利用可能です。

XML 文書中の開始タグにおいて記述される属性値は、 時には重要な役割を持つことがあります。 しかし、属性値を要素の開始より後で利用する場合 (例: NotificationelementEnded() からの利用)、 その値を保持し続ける必要があります。

AbstractElementwatchAttribute() および getAttribute() によって、 要素の開始より後での属性値へのアクセスを補助します。

watchAttribute() によって、 AbstractElement に属性値の監視と保持を行わせることが出来ます。 例えば:


compositeElement.watchAttribute("", "foo");

"foo" 属性値の監視と保持

上記処理により、 XML 文書中の開始タグで(名前空間無しの) "foo" 属性値が記述された場合、 compositeElement はその値を保持します。

XML 文書中の開始タグで記述された foo" の値は、 getAttribute() メソッドにより取得することが出来ます。


compositeElement.getAttribute("", "foo");

"foo" 属性値の取得

当該要素による解析(再開)の際に clear() メソッドが実行されるまで 属性値が保持されます。

XML 文書中の開始タグで属性値が指定されていたとしても、 watchAttribute() を実施しない限りは、 属性値を取得することは出来ません。

開始タグでの値 監視
監視有り 監視無し
記述有り 記述された値 null
記述無し null null

次節「要素の反復」へ

詳細情報

クラス名

本チュートリアルでは、 クラスは全てクラス名のみで表記されています。 完全な名称は以下の通りです。

表記完全名
AbstractElement jp.ne.dti.lares.foozy.sasax.AbstractElement
Element jp.ne.dti.lares.foozy.sasax.Element
Notification jp.ne.dti.lares.foozy.sasax.Notification
ParseContext jp.ne.dti.lares.foozy.sasax.ParseContext