赤紫蘇2.リファレンス

 データモデル

akaxiso2.0-beta1


赤紫蘇データモデル

赤紫蘇のデータモデルは、XML Schemaの抽象データモデルをベースとして作成されています。
しかし、若干の機能の割り振りの異なりがあります。C++のクラスで、XML Schemaのデータモデルを表現した際に、クラスの数が非常に多くなり、煩雑となることを考慮しているからです。

複雑型<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のようなパーティクルは、常に、xs:complexType内で定義されるか、グループを参照して、使用することとなります。

XML Schemaドキュメントに対し、XMLドキュメントは、スキーマという型に対するインスタンスとして捕らえることができます。つまり、XML Schemaのパーティクルは、xs:complexTypeタグ内で宣言しない限り、インスタンシングできないと考えることができます。

しかしながら、赤紫蘇データモデルは、C++クラスを対象とします。xs:complexTypeで定義される複雑型が XML ドキュメントとしてインスタンシング可能であることを考慮すると、インスタンシングできるC++クラスは、xs:complexTypeによる宣言と対応していると考えることができます。

このため、赤紫蘇データモデルにおけるパーティクル、aka:sequence、aka:choice、aka:allは、XML Schemaのパーティクルの機能に加え、xs:complexTypeの機能を(場合によっては限定的に)併せ持ちます。また、明示的に、xs:complexTypeに対応する要素はありません。

赤紫蘇データモデルにおいて定義されたパーティクルは、xs:complexTypeと同様、他のモデルから参照されることを許します(型の参照、もしくは、モデルの参照) 。また、aka::sequence、aka::allでは、属性の宣言を行うことができます。

簡単にまとめた表を、以下に示します。

赤紫蘇データモデル 属性の使用 モデルグループ参照 実体
aka:sequence メンバを持つクラス
aka:all × メンバを持つクラス
aka:choice × コンテナ(メンバを持たない)

aka:sequenceは、xs:complexTypeとxs:sequenceの機能を併せ持つデータタイプです。
値クラスは、メンバを持つクラスとして定義され、属性宣言も許されます。xs:complexTypeにもっとも近いデータタイプです。

aka:allは、xs:allを下敷きにして作られています。値クラスは、メンバを持つクラスとして定義され、属性宣言も許されます。しかしながら、xs:allの子要素がxs:elementに限定されているように、モデルグループの引用はできません。また、出現頻度の指定も制限がかけられています。

aka:choiceの値クラスは、(STL)コンテナとして定義され、クラス自体がメンバを持つことを考慮していません。このため、属性宣言はできません。子要素として、通常の型に加え、モデルグループの引用が可能です。
aka:choiceと属性を併せて使用するには、aka:sequenceをxs:complexTypeの代用として使用し、クラスのメンバとして(STL)コンテナを用いることで、実現できます。

単純型

赤紫蘇データモデルにおける単純型は、タグに囲まれたテキスト、もしくは、属性値として扱われます。

赤紫蘇2は、赤紫蘇データモデルによる、XMLドキュメントの妥当性検証機能を持ちますが、単純型の妥当性検証について、実装を提供しません。必要に応じ、ユーザが実装することとなります。

赤紫蘇2は、(デ)シリアライザであり、パースして得られるテキストをC++の値クラスへと変換する必要があります。単純型の内容検証を行う汎用のエンジンを実装することは可能ですが、これだけでは、対象となる値クラスへの読み込み・書き出しが行えないためです。

おのおのの単純型に対応するテキストをパースし、値クラスに代入する部分は、ユーザによる実装となりますが、この部分でのエラーチェックにより、妥当性検証も行われることとなります。

xs:simpleContent

単純型を拡張するxs:simpleContentに対応する要素として、aka:simplecontentがあります。aka:simplecontentは、属性を持つ単純型として扱われます。単純型に固定値(@fixed)を指定する場合にも使用することができます。

xs:complexContent

複雑型を拡張・制限するxs:complexContentに対応する機能は、赤紫蘇2データモデル中には、ありません。C++クラスの継承や、アクセス制限などを用いて、同等の機能を実現することは可能です。

混合型(mixed)

要素と要素の間にあるテキスト値は、混合型のデータとして用いられます。赤紫蘇2データモデルでは、混合型XML文書を定義することはできません。ただし、混合型のXML文書をデシリアライズすることは可能です。この際、混合型のテキスト要素は、無視されます。


リファレンストップに戻る 赤紫蘇ホームページへ sourceforgeプロジェクトページへ