赤紫蘇2 リファレンス

aka:sequence

akaxiso2.0-beta3


赤紫蘇2リファレンス

1.概要
1.1 赤紫蘇2の構成
1.2 プログラムの
開始から終了まで
1.3 文字コードと
文字コード変換エンジン
1.4 名前空間とQName
1.5 マルチスレッディング

2. 赤紫蘇2データモデル
2.1 チュートリアル
2.2 パーティクル
2.3 aka:sequence
2.3.1 単純型の子要素
2.3.2 複合型の子要素
2.3.1 配列型
2.4 aka::all
2.5 aka:choice
2.5.1 複雑型の子要素
2.5.2 単純型の子要素
2.5.3 バインダクラス
2.5.4 子要素オブジェクト
(aka::item)の扱い
2.5.5 子要素の出現頻度
2.6 属性
2.7 aka:simpleContent
2.8 単純型(aka:simleType)
2.8.1

組み込み型

2.9

配列とポインタ

2.,10 ワイルドカード

3 XMLによる永続化
3.1 シリアライズ
3.2 デシリアライズ

付表
A ライブラリ主要API
B XML Schemaとの
機能対応表
C リリースノート

aka:sequenceは、出現順序が定められた子要素を持つ、赤紫蘇2データモデルにおけるパーティクルです。対応するXMLスキーマでの表現を以下に示します。

<xs:complexType name="particle_name">
  <xs:sequence>
    <!-- 0個以上の  elementやグループ参照、ワイルドカード要素。
出現頻度の指定可能 --> <xs:element name="element1" type="xs:string"/> <xs:group ref="group1"/>
<xs:element name="anyType" type="xs:anyType"/>   <xs:any> ; 以下続く </xs:sequence> <!-- 0 個以上の属性 --> <xs:attribute name="attribute" type="xs:string"/> ; 以下続く </xs:complexType>

子要素としては、0個以上の<xs:element>やパーティクル、グループ参照、ワイルドカード要素の指定を行うことができます。
また、属性を持つこともできます。

C++の値クラスは、通常のクラス(class、struct)を用いて宣言します。また、子要素、属性が、値クラスのメンバとして宣言されます。

また、対応するaka:sequenceの型情報は、leafクラスにより定義されますが、aka::sequence<>クラステンプレートを継承する必要があります。
aka::sequence<>クラスの宣言は、以下のとおりです。

namespace aka {
 template<class T, class L = xiso::leaf<T> > class sequence;
}

class Tは、値クラスの型です。Lは、leafクラスであり、デフォルトとして、xiso::leaf<T>が割り当てられています。

子要素の定義

子要素として、複雑型、単純型のメンバを持つことができます。

また、子要素の出現頻度に関しても、通常の子要素(出現頻度1)ごして、配列型(0〜∞の範囲で設定)、ポインタ型(0 or 1)が指定可能です。

複雑型の子要素の場合、子要素として、他のモデルグループを参照することができます。
単純型の子要素の場合には、デフォルト値を持つ子要素の定義、固定値の子要素定義を行うことができます。

以上を表にまとめて、下記に示します。

子要素の型 複雑型 単純型
通常の子要素
配列型
ポインタ型
モデルグループ参照 ×
デフォルト値 ×
固定値 ×

子要素定義のための構文

leafクラスのmodel()メソッド内で、メンバ定義を行うために、以下に示すクラス(struct)が使用可能です。
実際の用法については、複雑型メンバの定義単純型メンバの定義をご参照ください。

struct member {
  // コンストラクタ(1)
  template<class P, class V>
  member(const std::string &tagname, V P::* m);

 // コンストラクタ(2) 
template<class P, class V, class VL>
  member(const std::string &tagname, V P::* m, const VL&); 

  // コンストラクタ(3)
template<class P, class V>
  member(const std::string &tagname, V P::* m, int minOccurs, int maxOccurs); 

// コンストラクタ(4) 
template<class P, class V, class VL> 
  member(const std::string &tagname, V P::* m, const VL&, int minOccurs, int maxOccurs,
         bool emptiable = false); 

// デフォルト値指定
  void set_default(const std::string &defval); 
};

コンストラクタ(1)は、一番基本的な書式です。tagnameでタグ名を指定し、mでメンバを定義します。
コンストラクタ(2)は、上記の書式に加え、leafクラスを明示的に、指定できます。
コンストラクタ(3)は、メンバが配列(コンテナ)の場合に用います。上記の書式に加え、minOccurs、maxOccursで出現頻度を指定します。minOccursに指定できる値は、0以上の整数です。また、maxOccursに指定できる値は、1以上の整数、もしくは、上限無しを意味するaka::unboundedです。
コンストラクタ(4)は、コンストラクタ(3)に加え、leafクラスを明示的に指定できます。また、最後の引数であるemptiableをtrueに設定すると、minOccursが0以外の場合でも、出現頻度0の場合を許します。

ポインタ型の使用

出現頻度、minOccurs=0, maxOccurs=1とされる子要素を定義するために、ポインタ型の定義が可能です。
ポインタ型のメンバは、aka::deep_ptr<>によって、定義されるスマートポインタを用いて実装できます。

ポインタ型のメンバには、struct ptrmemberを用います。

struct ptrmember {
  // コンストラクタ(1)
  template<class P, class V>
  ptrmember(const std::string &tagname, V P::* m);
  // コンストラクタ(2)
  template<class P, class V, class VL>
  ptrmember(const std::string &tagname, V P::* m, const VL&);
};

コンストラクタ(1)では、第一引数は、タグ名、第二引数は、メンバへのポインタとなります。
コンストラクタ(2)また、追加して、第三引数として、leafクラスを指定することができます。第三引数として、deep_ptr<>が用いる値(deep_ptr<T>の場合、T型>)に対するleafクラスを指定します。

any型の定義

xs:anyに対応するaka::anyを定義するために、any()関数を使用することができます。(用法については複雑型メンバの定義を参照)

template<class P>
void any(const std::string &tagname, aka::any P::* m, 
         const std::string ns_list = "#all"); 

固定値(fixed)の定義

固定値は、単純型の子要素に対して定義することができます。
デシリアライズ時に、指定された値以外の値がXML文書中に存在した場合、パースエラーとします。

固定値に対して、struct fixed_member<>テンプレートを用い、定義します。(用法については単純型メンバの定義を参照)

template<class V>
struct fixed_member {
  fixed_member(const std::string &tagname, const std::string &fixed_value);
  template<class VL>
  fixed_member(const std::string &tagname, const std::string &fixed_value, const VL &);
};

aka:sequenceの値クラスには、固定値を収めるためのメンバを、定義する必要がありません。

固定値の配列の場合には、struct fixed_array<>テンプレートを用います。(用法については単純型メンバの定義を参照)

struct fixed_array {
  template<class P, class V>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m,
               int minOccurs, int maxOccurs);

  template<class P, class V, class VL>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m, const VL &,
                int minOccurs, int maxOccurs, bool emptiable = false);
};

固定値の配列の場合には、固定値として現れる子要素の数を収めるために、コンテナを使用します。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。

また、シリアライズ時には、配列中のインスタンスの値は、どのような値であっても、固定値で指定した値となります。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。


赤紫蘇2トップへ sourceforgeプロジェクトページへ