赤紫蘇2.
赤紫蘇の機能 (XMLSchema機能対応表)
赤紫蘇は、二つの名前空間aka::、xiso::により構成されています。
aka::名前空間では、シリアライザとしてのフレームワークを提供します。
実際のドキュメントの値を保持するクラスは、ユーザ定義となります。このユーザ定義クラスの型情報は、別のクラスとして定義されます。このクラスをleaf<>クラスと呼びます。
通常は、leaf<>クラスを、xiso::名前空間内で定義することにより、シリアライゼーションが可能となります。
赤紫蘇は、XMLスキーマで表現されるモデルをシリアライズ、デシリアライズすることができます。
以下に、スキーマ要素とクラスの間の対応を示します。
| XMLSchema要素 | C++クラスによる表現 | XML型情報の定義 |
| schema/element | インスタンシングできるクラス | aka::doctype()を用いて、ドキュメントのトップノードであることを明示。 |
| schema/complexType | インスタンシングできるクラス | leaf<>クラスの宣言が行われていること。 |
| schema/attribute | N.A. | 参照するクラスにおいて定義された型を引用 |
| sequence | インスタンシングできるクラス。 メンバを要素の値として使用。 |
leaf<>クラスにおいて、aka::sequence<>を継承する。また、leaf<>クラス内のvoid model()メソッドで内で、要素を定義。 |
| choice | aka::itemを値として持つSTLコンテナにより実装。 | aka::sequential_choice<>、 aka::associative_choice<>によりleaf<>クラスを定義。 |
| all | インスタンシングできるクラス。 クラスのメンバを要素の値として使用。 |
leaf<>クラスにおいて、aka::all<>を継承する。leaf<>クラス内のvoid model()メソッドで、要素を定義。 |
| simpleContent | インスタンシングできるクラス。 メンバを値、属性をとする。 |
leaf<>クラスにおいて、aka::simplecontent<>を継承し、void model()メソッドで、要素を定義。 |
| attribute (complexType内) |
クラスのメンバを属性値として使用。 | sequence、all、simpleContentの場合に定義可能。クラスのメンバとして表現される。 |
|
N.A. | voide model()メソッド内、attribute()クラスのset_default()メソッドにて定義。パース時にメンバに設定されたデフォルト値を書き込む。 |
|
N.A. | void model()メソッド内において、fixed_attribute<>クラスを用いて定義。leaf<>クラス内のみで定義される。 |
|
N.A. | voide model()メソッド内の、member()クラスのrequired(bool val)メソッドにて定義。 |
| element (sequence、all内) |
all、sequenceクラス内のメンバが要素値となる。 | leafクラス内のvoid model()メソッドで、member()、ptrmember()を用いて定義。 |
| element (choice内) |
aka::itemに格納されるオブジェクト。 | leafクラス内のvoid model()メソッドで、item()を用いて定義。 |
|
element@default |
N.A. | void model()メソッド内、member()クラスのset_default()メソッドにて定義。パース時に、設定された値が、自動的に代入される。 |
|
element@fixed |
N.A. | void model()メソッド内において、fixed_attribute<>クラスを用いて定義。xisoクラス内のみで定義される。パース時に指定された値以外が読み込まれた時にパースエラーとする。 |
|
element@substitutionGroup |
仕様未定 | 仕様未定 |
| group | complexTypeと同様にインスタンシングできるクラスであれば、groupになれる。グループは、all、sequence、choice以下で参照可能。 | void model()メソッド内においての要素定義の再、タグ名の頭に"&"をつけることで定義。 choiceであれば、 item("&group名"); sequence、allであれば、 member("&group名") とする。 |
| any | aka::any、aka::any_arrayとして、赤紫蘇が値クラスを定義。 | void model()内で、any()を用いて、型情報を定義 "&"ではじめる適当な名前を付ける。(sequence、choiceとも同様) ただし、namespaceList、processContentsに関しては、サポート無し。 |
| anyType | aka::any、aka::any_arrayとして、赤紫蘇が値クラスを定義。 | void model()内で、any()を用いて、型情報を定義 タグ名を指定する。(sequence、choiceとも同様) |
| anyAttribute | any_attributesクラスで受ける | void model()内で、型情報を定義 ただし、namespaceList、processContentsに関しては、サポート無し。 |
| attributeGroup | 引用されるクラスにて、メンバとして属性値を定義 | それぞれattributeGroupを参照するクラスにて、タグ名を定義する。 |
| complexContent/restriction | クラス/構造体を継承、もしくは、それぞれのクラスにおいて、メンバを定義 | それぞれのleaf<>クラスにおいて、void model()内で、必要とされるメンバに対する型情報を定義。 |
| complexContent/extension | クラス/構造体を継承、もしくは、それぞれのクラスにおいて、メンバを定義 | それぞれのleaf<>クラスにおいて、void model()内で、必要とされるメンバに対する型情報を定義。 |
| simpleType extension/restriction |
ユーザが単純型検証ロジックを書き足すことで対応可能。 | ユーザがaka::simpletype<>を使用し、単純型を定義する。 |
| keybase/keyref | 対応せず。 | 対応せず。 |
| element、complexTypeの@abstract, @block, @final | N.A. | N.A. |
ホームに戻る 赤紫蘇2プロジェクトページへ