赤紫蘇2 リファレンス

赤紫蘇2データモデル モデル定義例

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 リリースノート

簡単な例として、以下のクラス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クラスの定義を行うことにします。xiso::名前空間を使う方法と、使わない方法の二つのスタイルでの例を示します。

  • スタイル1
//宣言
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()メソッド中で、タグ名とメンバを対応付けています。

赤紫蘇2では、leafクラスを定義するための名前空間として、namespace xiso を定義しています。スタイル1では、これを利用して定義を行っています。
もともとのleafクラスの宣言は、以下の通りです。上記のclass Tに、struct fooがテンプレート引数として与えられることにより、struct fooに対するleafクラスとして、xiso::leaf<foo>クラスが対応付けられます。

  • スタイル2
//宣言
struct foo_leaf : aka::sequence<foo, foo_leaf> {
  void model() { // 型定義用メソッド
    member("member1", &foo::member1);
  }
};

//実装
void::model() { 
  member("member1", &foo::member1_);
}

スタイル2では、xiso::名前空間を用いず、明示的に、leafクラスの型を指定しています。

スタイル2は、ひとつの型を二つ以上の形式で(デ)シリアライズする場合に必須となります。
たとえばchar型のメンバの(デ)シリアライズを行う際に、1文字として扱う場合、-128〜127の数値として扱う場合の両者があります。

スタイル1では、ひとつのクラスに対して、ひとつのleafクラスしか定義できないため、二通りの扱い、つまり、同じクラスに対するleafクラスを、別々に、二つ定義することができません。スタイル2では、ひとつの型に対して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()関数を呼び出します。

  • スタイル1
aka::doctype("foo", xiso::leaf<foo>());
  • スタイル2
aka::doctype("foo", foo_leaf());


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