|  |  | 赤紫蘇２．リファレンス
|  | 概要
| 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機能対応表 |  | 赤紫蘇２は、C++のクラスをXML形式に、シリアライズ、デシリアライズするためのライブラリです。 シリアライザブルな値クラスは、ユーザにより定義され、XML-Schemaに準じたデータの構造をもつことができます。 また、STLベースで実装されており、XMLパーサ、エンコーディング変換エンジンもライブラリ内に含まれています。このため、標準C++の環境のみに依存します。外部ライブラリへの依存性を気にする必要もありません。 XMLパーサレベルでの、より、厳密な妥当性検証が必要な場合には、XMLパーサとしてXerces-C++を使用することも可能です。 シリアライザブルなクラスへの要請 以下の要請を満たすクラスが、シリアライザブルとなります。 DefaultConstructiveであること。 A a; などの形でインスタンシングできること。 引数つきのコンストラクタのみを持っている場合はダメ。 CopyConstructiveであること。 コピーコンストラクタが使えること。 class A { private: A(const A&); }; などとして、コピーコンストラクタが遮蔽されている場合はダメ。 値クラスは、通常のクラスです。通常のクラス、構造体が使用可能です。ただし、値クラスのメンバに対し、後述するXML型情報クラス(leafクラス)がアクセスできる必要があります。 上記以外には、特別の制約はなく、自由なクラス定義を行うことが可能です。 赤紫蘇２は、シリアライザブルな値クラスを(デ)シリアライズするための機能を、二つの名前空間aka::、xiso::内に実装しています。 シリアライザブルな値クラスは、任意の名前空間内、もしくは、グローバル名前空間内にて、宣言することができます。また、値クラスを(デ)シリアライズするためのXML型情報クラスを別個に定義します。このクラスをleafクラスと呼び、通常は、xiso::名前空間内で定義します。値クラスのデータモデルの構造、タグ名とメンバや要素の対応、出現頻度などの型情報が、leafクラス内で定義されます。 aka::名前空間内には、シリアライザブルな値クラスと、XML型情報クラス(leafクラス)の二つのクラスを結び合わせ、値クラスのメンバ、子要素へのアクセスとタグ名の関連付けを行い、XML形式への変換、逆変換を行うための実装が収められています。また、デシリアライズ時に、赤紫蘇のデータモデルによる妥当性検証を行います。 簡単な定義の例 簡単な例として、以下のクラスfooを値クラスとして用いた場合の、(デ)シリアライズについて説明します。
    struct foo {
      long value1_;
      long value2_;
    };
上記のクラスが、
    <?xml version="1.0"?>
    <foo>
     <value1>15</value1>
     <value2>20</value2>
    </foo>
とシリアライズされるように、XML型情報クラス(以降 leafクラス)を定義します。 まず、要素が<value1>、<value2>と順に出力されますので、xs:sequence型に対応させます。このための、leafクラスの定義は、以下の二つのスタイルで行うことができます。 スタイル１
    //宣言
    namespace xiso {
      template<>
        struct leaf<foo> : aka::sequence<foo> {
          void model(); // 型定義メソッド
    };

    //実装
    void xiso::leaf<foo>::model() {
      member("value1", &foo::value1_);
      member("value2", &foo::value2_);
    };
struct leaf<foo>は、aka::sequence<>テンプレートを継承しており、データモデルをsequence型として処理します。void model()メソッド中で、タグ名とメンバを対応付けています。 赤紫蘇２では、leafクラスを定義するための名前空間として、namespace xiso を定義しています。スタイル１では、これを利用して定義を行っています。 もともとのleafクラスの宣言は、以下の通りです。
    namespace xiso {
      template<class T>
      struct leaf<T>;
    };
上記のclass Tに、struct fooがテンプレート引数として与えられることにより、struct fooに対するleafクラスとして、xiso::leaf<foo>クラスが対応付けられます。 スタイル２
    //宣言
    struct foo_leaf : aka::sequence<foo, foo_leaf> {
      void model() { // 型定義用メソッド
        member("member1", &foo::member1);
      }
    };

    //実装
    void::model() {
      member("member1", &foo::member1_);
    }
スタイル２では、namespace xisoを用いず、明示的に、leafクラスの型を指定しています。 スタイル２は、ひとつの型を二つ以上の形式で(デ)シリアライズする場合に必須となります。 たとえばchar型のメンバの(デ)シリアライズを行う際に、1文字として扱う場合、-128〜127の数値として扱う場合の両者があります。 スタイル１では、ひとつのクラスに対して、ひとつのleafクラスしか定義できないため、二通りの扱い、つまり、同じクラスに対するleafクラスを、別々に、二つ定義することができません。スタイル２では、ひとつの型に対してleafクラスを二つ以上、別個に定義することができます。char型の例では、値を数値として扱うleafクラス、一文字として扱うleafクラスをそれぞれ定義することにより、ひとつの型に対し、二通りの方法で、(デ)シリアライズを行うことが可能となります。 単純型以外のleafクラスは、常にmodel()メソッドを持ち、内部で、以下の項目を定義します。 パーティクル定義(xs:sequence、xs:choice、xs:allなど) タグ名とメンバ値(xs:sequence, xs:all)、子要素値(xs:choice)の対応 出現頻度(minOccurs, maxOccurs) グループ参照(xs:group) ドキュメントの宣言 ドキュメントの宣言は、aka::doctype()関数をもちいて、leafクラスとドキュメントのタグ名を対応付けることで行います。 たとえば、上述のfooクラスのドキュメントを宣言するには、以下のように、aka::doctype()関数を呼び出します。 スタイル１
    aka::doctype("foo", xiso::leaf<foo>());
スタイル２
    aka::doctype("foo", foo_leaf());

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