![]() |
赤紫蘇2.リファレンス |
||||||||||||||||||
データモデル |
|||||||||||||||||||
akaxiso2.0-beta1 | |||||||||||||||||||
|
|||||||||||||||||||
赤紫蘇データモデル 赤紫蘇のデータモデルは、XML Schemaの抽象データモデルをベースとして作成されています。 特に、xs:complexTypeについては、赤紫蘇データモデルにおいて、明確に対応する要素がなく、単に、インスタンシングできるクラスとして、対応付けられます。 複雑型<xs:complexType>とパーティクル 赤紫蘇データモデルでは、aka:sequence、aka:all、aka:choiceという三つのパーティクルがデータモデルの構造を記述するために用いられます。これらのパーティクルは、大まかに、XML Schemaで用いられるパーティクル、xs:sequence、xs:all、xs:sequenceのそれぞれに対応します。 XML-Schemaにおいて、使用可能な複雑型は、xs:complexTypeタグを用いて、定義されます。また、xs:sequence、xs:all、xs:choiceのようなパーティクルを、直接的に、型として、XML文書中では使用できず、常に、xs:complexType内で定義、もしくは、名前を引用(グループ参照)以下で定義することになります。 しかしながら、赤紫蘇データモデルは、C++クラスを対象とします。XML Schemaでxs:complexTypeで定義される複雑型が XML ドキュメントとしてインスタンシング可能であることを考慮すると、インスタンシングできるC++クラスは、xs:complexTypeと同様の機能を持つと考えることができます。 このため、赤紫蘇データモデルにおけるパーティクル、aka:sequence、aka:choice、aka:allは、XML Schemaのパーティクルの機能に加え、xs:complexTypeの機能を(場合によっては限定的に)併せ持ちます。 たとえば、定義された複雑型は、他のモデルからの参照を許します(型の参照、もしくは、モデルの参照) 。また、aka::sequence、aka::allに関しては、属性の宣言をサポートします。 簡単にまとめた表を、以下に示します。
aka:sequenceは、xs:complexTypeとxs:sequenceの機能を併せ持つデータタイプです。 aka:allは、xs:allを下敷きにして作られています。値クラスは、メンバを持つクラスとして定義され、属性宣言も許されます。しかしながら、xs:allの子要素がxs:elementに限定されているように、モデルグループの引用はできません。また、出現頻度の指定も制限がかけられています。 aka:choiceの値クラスは、(STL)コンテナとして定義され、クラス自体がメンバを持つことを考慮していません。このため、属性宣言はできません。子要素として、通常の型に加え、モデルグループの引用が可能です。 単純型 赤紫蘇データモデルにおける単純型は、タグに囲まれたテキスト、もしくは、属性値として扱われます。 赤紫蘇2は、XMLドキュメントの妥当性検証機能を持ちますが、単純型の内容検証について、赤紫蘇2は、実装を提供しません。必要に応じ、ユーザが実装することとなります。赤紫蘇2は、(デ)シリアライザであり、パースして得られるテキストをC++の値クラスへと変換する必要があります。単純型の内容検証を行う汎用のエンジンを実装することは可能ですが、これだけでは、デシリアライズが行えないためです。 おのおのの単純型に対応するテキストをパースし、値クラスに代入する部分は、ユーザによる実装となりますが、この部分でのエラーチェックにより、内容検証も行われることとなります。 xs:simpleContent 単純型を拡張するxs:simpleContentに対応する要素として、aka:simplecontentがあります。aka:simplecontentは、属性を持つ単純型として扱われます。単純型に固定値(@fixed)を指定する場合にも使用することができます。 xs:complexContent 複雑型を拡張・制限するxs:complexContentに対応する機能は、赤紫蘇2データモデル中には、ありません。C++クラスの継承や、アクセス制限などを用いて、同等の機能を実現することは可能です。 混合型(mixed) 要素と要素の間にあるテキスト値は、混合型のデータとして用いられます。赤紫蘇2データモデルでは、混合型XML文書を定義することはできません。ただし、混合型のXML文書をデシリアライズすることは可能です。この際、要素間で現れるテキストは、無視されます。 |