|  |  | 赤紫蘇２．リファレンス
|  | aka:sequence 出現頻度定義
| akaxiso2.0-beta1 |
| 目次 はじめに 1. 概要 2. ライブラリAPI 3.単純型 4. 組み込み型 5. 配列 6. ポインタ 7. データモデル 8. aka:sequence 8.1 メンバ定義(単純型) 8.2 メンバ定義(複雑型) 8.3 出現頻度定義 9. aka:all 10 aka:choice 10.1 要素の定義 10.2 固定値の定義 10.3 mocクラス 10.4 itemの扱い 11 aka:simplecontent 12 属性 13 XML Schema機能対応表 |  | メンバの要素における出現頻度については、すでに説明しましたが、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はそのような定義を含みます。) 赤紫蘇２では、上記の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クラスのインスタンスが格納されます。最初の二つには、struct fooインスタンスが5こずつ格納され、最後のひとつに、2つのstruct fooインスタンスが格納されます。

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