| MAP | SASAX ドキュメント > チュートリアル > SASAX による解析 > 固有要素 | << | >> | 
本節では、SASX を用いて、 オブジェクトを XML 文書からアンマーシャリング(un-marshaling) するための固有要素の生成方法を説明します。
"文書構造" に示す 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"
          minOccurs="0"
          form="qualified"/>
      </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>
前述の文書を解析するためのクラスは、 "固有クラス" に示すように定義されます。
public class CustomElement
    extends CompositeElement
{
    final static private String URI =
        "http://www.lares.dti.ne.jp/~foozy/";
    final private IntElement int_ =
        new IntElement(this, URI, "int");
    final private StringElement string_ =
        new StringElement(this, URI, "string");
    ////////////////////////////////////////
    public CustomComposite(Element parent){
        super(parent, URI, "custom");
        addMustItem(int_);
        addOptionalItem(string_);
    }
}
上記の例は、 これまでの節の説明を元に理解することができるでしょう。
勿論、
外部からのアクセスのために、
"int_"(および "string_")を
"public" として定義することも可能です。
"文書構造の構築"(= CustomElement の定義そのもの) を
"解析における挙動の記述"
(例: Notification の追加)
から分離することが出来ますから、
"public" として定義するのは良いアイディアだと思います。
XML 文書の解析結果から、 固有コンテナのインスタンスを生成するメソッドの例を、 "CustomContainer の生成" に示します。
final public CustomContainer getValue(boolean ensure){
    if(ensure){ ensureDetermined(); }
    // 未だ確定していない場合
    if(!isDetermined()){ return null; }
    CustomContainer container = new CustomContainer();
    // int_ は必須項目として登録されているので、
    // int_#getInteger は常に非 null を返却するはず
    container.setInteger(int_.getInteger(false));
    // string_ は付加項目として登録されているので、
    // string_#getString は null を返却するかもしれない
    container.setString(string_.getString(false));
    return container;
}
要素における解析が完了したか否かに応じて、
isDetermined() メソッドは真値/偽値を返しますし、
ensureDetermined() は
IllegalStateException 例外を浮揚します。
getValue の振る舞いは以下のようになります。
| 値確定 (= isDetermined()) | 
"ensure" 引数 | |
|---|---|---|
| false | true | |
| false | null 返却 | 例外浮揚 | 
| true | オブジェクト返却 | オブジェクト返却 | 
今回のチュートリアルのような状況の場合、
(1) 対象の確定性が既に保証済みであるか、
(2) null 返却を許す場合に限り、
ensure メソッドの引数に "false" を指定すべきです。
前述の int_ および string_ の両者に対して、
getInteger ないし
getString メソッド起動における
"ensure" 引数として "false" が指定されていますが、
両者の意味合いは同一ではありません。
int_.getInteger() 起動に
"false" が指定されているのは、
int_ が必須項目として登録されているために、
CustomElement と同一の確定性を持ち、
且つその確定性は既に保証済みであるので、
確認処理を省略するためです。
string_.getString() 起動に
"false" が指定されているのは、
(a) string_ が付加項目として登録されているために、
値の確定確認処理を省略する
(省略しない場合、値が未確定の際に例外浮揚要因と成り得る)ためと、
(b) 確定していない場合に null 値を得るためです。
CustomContainer#setString() が null 引数を許さない場合には、
string_ の確定性を確認してから起動する必要があります。
"文書の解析" に示すコードにより、 XML 文書を解析することが出来ます。
CustomElement customElement = new CustomElement(null);
try{
    ElementDrivenHandler handler =
    new ElementDrivenHandler(customElement);
    handler.parse(reader);
    // この位置への到達自体が確定性を保証しているため、
    // "getValue" に "false" を指定しても安全です
    CustomContainer container = customElement.getValue(true);
    // container を用いた処理をここで行う ....
}
catch(Exception e){
    // 以下の記述は例外浮揚を起こし得ます
    customElement.getValue(true);
    // 以下の記述は null を返却し得ます
    customElement.getValue(false);
}
チュートリアル本節におけるコードの完全なものは、
配布物の src/demo/sasax/src 配下にある
jp.ne.dti.lares.foozy.sasax.CustomDemo です。
このクラスはバイナリ配布版中の demo.jar に含まれています。
"複合要素" 節の "概要"をご覧下さい。
| MAP | SASAX ドキュメント > チュートリアル > SASAX による解析 > 固有要素 | << | >> |