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

複合要素

本節では、 SASAX を用いて、 他の要素から構成される複合要素を解析する方法について説明します。

文書構造の定義

XML Schema によるスキーマおよび文書例を "文書構造" に示します。

XML Schema によるスキーマ:

<xs:schema 
  targetNamespace="http://www.lares.dti.ne.jp/~foozy/"
  xmlns:xs="http://www.w3.org/2001/XMLSchema"
  xmlns:local="http://www.lares.dti.ne.jp/~foozy/">

  <xs:simpleType name="int">
    <xs:restriction base="xs:integer"/>
  </xs:simpleType>

  <xs:simpleType name="string">
    <xs:restriction base="xs:token"/>
  </xs:simpleType>

  <xs:element name="composite">
    <xs:complexType>
      <xs:sequence>
        <xs:element name="int" type="local:int"
          form="qualified"/>
        <xs:element name="string" type="local:string"
          form="qualified"
          minOccurs="0"/>
      </xs:sequence>
    </xs:complexType>
  </xs:element>
</xs:schema>

例:

<foozy:composite
 xmlns:foozy="http://www.lares.dti.ne.jp/~foozy/">
  <foozy:int>
    12245678
  </foozy:int>
  <foozy:string>
    optional text message
  </foozy:string>
</foozy:composite>

文書構造

対象文書が以下の特徴を持つことがわかります。

要素オブジェクト(群)の生成

前述の文書を解析するためのオブジェクト群は、 "要素オブジェクト(群)の生成" に示すようにして生成されます。


String uri = "http://www.lares.dti.ne.jp/~foozy/";

CompositeElement compositeElement =
new CompositeElement(null, uri, "composite");

IntElement intElement =
new IntElement(compositeElement, uri, "int");
composite.addMustItem(intElement);

StringElement stringElement =
new StringElement(compositeElement, uri, "string");
composite.addOptionalItem(stringElement);

要素オブジェクト(群)の生成

"composite" 配下の要素は、 生成後に "composite" に対して登録されています。 登録メソッドの違い (addMustItemaddOptionalItem) は、要素の必須性の違いです。

備考: CompositeElement にまつわる想定外の挙動の多くは、 addMustItem(あるいは addOptionalItem) の起動し忘れに起因しています。

これらの起動の有無を確認してください。

文書の解析

"文書の解析" に示すコードにより、 XML 文書を解析することができます。


ElementDrivenHandler handler =
new ElementDrivenHandler(compositeElement);
handler.parse(reader);

文書の解析

ElementDrivenHandler#parse 起動後、 "intElement" 要素に対して、 IntElement クラスの getInteger メソッドを起動することによって、 整数値を取得することが出来ます (あるいは、 "stringElement" 要素に対して、 StringElement クラスの getString メソッドを起動することによって、 文字列値を得られるかもしれません)。 これらのメソッドの引数に関する詳細に関しては、 "固有要素" ないし API ドキュメントを参照してください。

チュートリアル本節におけるコードの完全なものは、 配布物の src/demo/sasax/src 配下にある jp.ne.dti.lares.foozy.sasax.CompositeDemo です。 このクラスはバイナリ配布版中の demo.jar に含まれています。


次節「解析におけるフック」へ

詳細情報

クラス図

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

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

オブジェクト図

本節におけるオブジェクト図を以下に示します。

オブジェクト図
オブジェクト図 (クリックで拡大表示)

シーケンス図

ElementDrivenHandler、CompositeElement および Element 実装クラスにおける処理フローは以下のようになります。

  1. ElementDrivenHandler が CompositeElement の "startElement" を起動
  2. CompositeElement は次のイベント受領者として自身を返却
  3. ElementDrivenHandler は "compositeElement" を次のイベント受領者として保持
  4. ElementDrivenHandler は CompositeElement の "startElement" を再度起動
  5. CompositeElement は Element(現状は IntElement)に "startElement" を委譲
  6. IntElement は次のイベント受領者として自身を返却
  7. ElementDrivenHandler は "intElement" を次のイベント受領者として保持
  8. ElementDrivenHandler は "intElement" のメソッドを起動
  9. .....
  10. ElementDrivenHandler は IntElement の "endElement" を起動
  11. IntElement は次のイベント受領者として "compositeElement" を返却
  12. ElementDrivenHandler は "compositeElement" を次のイベント受領者として保持
  13. ElementDrivenHandler は "compositeElement" のメソッドを起動

加えてシーケンス図を以下に示します。

シーケンス図
シーケンス図 (クリックで拡大表示)

クラス名

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

表記完全名
CompositeElement jp.ne.dti.lares.foozy.sasax.CompositeElement
ElementDrivenHandler jp.ne.dti.lares.foozy.sasax.ElementDrivenHandler
IntElement jp.ne.dti.lares.foozy.sasax.IntElement
StringElement jp.ne.dti.lares.foozy.sasax.StringElement