赤紫蘇2.リファレンス

 aka:sequence 出現頻度定義


メンバの要素における出現頻度については、すでに説明しましたが、xs:sequence自身に、出現頻度を定義する場合もあります。

その際には、以下の形式で、出現頻度を、model()メソッド内に定義します。

void occurrence(int minOccurs, int maxOccurs); 

このsequenceを使用する側では、配列としてこの要素を受ける必要があります。
以下に例を示します。

// 値クラスの定義
struct foo {
  std::string member_;
};

typedef std::vector<foo> foo_array;

struct bar {
  foo_array foos_;
};


//leafクラスの定義
struct foo_leaf : aka::sequence<foo, foo_leaf> {
  void model() {
    occurrence(0, 5);
    member("member", &foo::member_);
  }
};

typedef sequential_array<foo_array, foo_leaf> foo_array_leaf;

struct bar_leaf : aka::sequence<bar, bar_leaf> {
  void model() {
    member("foo", &bar::foos_, foo_array_leaf());
  }
};

上記の例では、fooの出現頻度を、0個以上、上限なしとしています。これを使用するstruct bar側で、配列(foo_array)としてメンバを宣言しています。この際、minOccurs、maxOccursを指定していませんが、foo_leaf内で指定されたoccurrence()の定義が参照されます。

注:

さらに複雑なケースがあります。sequenceにおいて、occurrenceを定義し、さらに、その型を使用するメンバ宣言時にminOccurs、maxOccursを定義したくなることがあるはずです。(XML-Schema自体がひとつの例です。)
赤紫蘇2では、上記のstruct foo、foo_array、struct barのみを用いた、上記のリストのままでは、この構造を書くことができません。

もうひとつ、クラスを定義する必要があります。(下記のリスト中ではfoo_array_array)

// 値クラスの定義
struct foo {
  std::string member_;
};

typedef std::vector<foo> foo_array;

typedef std::vector<foo_array> foo_array_array; 

struct bar {
  foo_arrray_array foos_;
};


//leafクラスの定義
struct foo_leaf : aka::sequence<foo, foo_leaf> {
  void model() {
    occurrence(0, 5);
    member("member", &foo::member_);
  }
};

typedef sequential_array<foo_array, foo_leaf> foo_array_leaf;
typedef sequential_array<foo_array, foo_array_leaf> foo_array_array_leaf;  

struct bar_leaf : aka::sequence<bar, bar_leaf> {
  void model() {
    member("foo", &bar::foos_, 0, aka::unbounded, foo_array_array_leaf());
  }
};

デシリアライズ時に、<foo>要素が12個、現れた場合には、foo_array_array型のfoos_メンバ内には、三つのfoo_arrayクラスのインスタンスが格納されます。最初の二つには、5つのstruct fooインスタンスが格納され、最後のひとつに、2つのstruct fooインスタンスが格納されます。


ホームに戻る 赤紫蘇2プロジェクトページへ SourceForge.jp