| 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 による解析 > 固有要素 | << | >> |