![]() |
赤紫蘇2.リファレンス |
||
aka:sequence 出現頻度定義 |
|||
akaxiso2.0-beta1 | |||
|
|||
メンバの要素における出現頻度については、すでに説明しましたが、aka:sequence自身に、出現頻度を定義する場合もあります。 その際には、以下の形式で、出現頻度を、model()メソッド内に定義します。 void occurrence(int minOccurs, int maxOccurs); 出現頻度を定義したsequenceを参照し使用する側は、配列を用いて、この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はそのような定義を含みます。) もうひとつ、クラスを定義する必要があります。(下記のリスト中では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クラスのインスタンスが格納されます。最初の二つには、struct fooインスタンスが5こずつ格納され、最後のひとつに、2つのstruct fooインスタンスが格納されます。 |