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

パスの取り扱い

本節では、 SASAX における XML 文書の "パス" の扱いについて説明します。

パス拡張

パスプリミティブ

SASAX は、 現時点での XML 文書における階層情報を "パス" として知る機能を提供しています。 SASAX において、 "パス" は (1) URI、 (2) 名前および (3) 属性群を格納する "要素" のリストとして扱われます。

"パス" および "要素" は、 "Path" および "Path.Element" として定義されています。 Path は、 自身と他のインスタンスの間で、 例えば先祖性(ancestor-ness)や子孫性(descendant-ness) といったものを比較するユーティリティを提供しています。

パスのための拡張

XML 文書における現在の階層を "パス" として記録するのは、 さほど(性能的に)高価なことではありませんが、 そのような情報が不要な場合には単なるオーバヘッドに過ぎません。

そのため、 SASAX はそのような(例えば "パス" 情報の取り扱い)機能を "拡張" として定義しており、 拡張を個別に有効化/無効化する切り替え機能を提供することで、 実行時の解析コストを低減させています。 "パス拡張" は "PathExtension" として定義されています。

はじめに、 JVM プロセス毎に1回、 PathExtensionregister() を起動することで、 SASAX に "パス拡張" を "拡張" として認識させる必要があります。 その後は、 PathExtensionenable() メソッドを用いて、 解析ごと(実際には ElementDrivenHandler ごとですが) に "パス拡張" を有効化/無効化することが出来ます。


PathExtension.register();

ElementDrivenHandler handler = 
    new ElementDrivenHandler(rootElement);

PathExtension.enable(handler);

handler.parse(document);

パス拡張の有効化

パス取り扱いクラスの定義

パス取り扱いの例として、 各 "startElement" 時におけるパス階層を出力するコードを以下に示します。 このコードは src/bin 配布版の src/demo/sasax/src 配下にある PathDemo からの抜粋です。 このクラスはバイナリ配布版中の demo.jar に含まれています。


public Element startElement(ParseContext context,
                            String uri,
                            String lName,
                            Attributes attrs)
    throws SAXException //
{
    // 現在のパス階層の出力
    Path path = PathExtension.getPath(context);
    Iterator elements = path.getElements();
    while(elements.hasNext()){
        Path.Element element =
            (Path.Element)(elements.next());
        System.out.print("/");
        System.out.print(element.getLName());
    }
    System.out.println("");

    return this;
}

パス階層の出力

文書の解析

"文書の解析" に示すコードにより、 パスを扱いながら XML 文書を解析することが出来ます。


PathExtension.register();

PathDemo rootElement = new PathDemo(null);

ElementDrivenHandler handler =
    new ElementDrivenHandler(rootElement);

PathExtension.enable(handler);

handler.parse(reader);

文書の解析

詳細情報

クラス図

本節におけるクラス図を以下に示します。

クラス図
クラス図 (クリックで拡大表示)

クラス名

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

表記完全名
Element jp.ne.dti.lares.foozy.sasax.Element
ElementDrivenHandler jp.ne.dti.lares.foozy.sasax.ElementDrivenHandler
ParseContext jp.ne.dti.lares.foozy.sasax.ParseContext
ParseContextImpl jp.ne.dti.lares.foozy.sasax.ParseContextImpl
Path jp.ne.dti.lares.foozy.sasax.Path
PathExtension jp.ne.dti.lares.foozy.sasax.PathExtension