赤紫蘇2 リファレンス

aka:sequence メンバ定義(単純型)

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

本節では、単純型を子要素として持つaka:sequenceの定義について、説明します。

まず、簡単な例として、std::string型のmember_ メンバと、long型のポインタ型のメンバ、ptrmember_を持つstruct fooのデータモデル定義について、述べます。

struct fooがシリアライズできるためには、leafクラスが必要ですが、これを、struct foo_leafとして定義します。このクラスは、複雑型メンバを子要素として持つ場合と同様、aka::sequence<>を継承します。member_、ptrlong_メンバが、それぞれ、タグ名"member"、"ptrmember"としてシリアライズされるようにします。
また、void leaf<foo>::model()メソッド内にて、タグ名"member"と、foo::member_を、"ptrmember"と、foo::ptrmember_を対応付けます。

/* 値クラス */
struct foo {
 /* 子要素*/
  /* 普通の子要素 */
 std::string member_;
  /* ポインタ型 */
  aka::deep_ptr<long> ptrlong_;
  /* attribute */
  std::string attr_;
};

/* leafクラス */
namespace xiso {
 struct leaf<foo> : aka::sequence<foo> {
  void model() {
    /* メンバの定義 */
    member("member", &foo::member_,);
   /* ポインタ型メンバの定義 */
    ptrmember("ptrmember", &foo::member_,);  
    /* 属性の定義 */ 
    attribute("attr", &foo::attr_);
  }
};

attribute(属性)についても、類似の定義を行います。詳細については、「赤紫蘇2データモデル 属性」をご参照ください。

デフォルト値の定義

model()メソッド内で、メンバ定義を行うには、memberクラスと用います。デフォルト値を与える場合には、このmemberクラスのインスタンスに大使、set_default()メソッドを適用します。デフォルト値は、単純型の子要素にしか適用されません。以下の例では、foo::member_メンバのデフォルト値として、"default string"を指定しています。struct member { // コンストラクタ(1) template<class P, class V> member(const std::string &tagname, V P::* m); // コンストラクタ(2) template<class P, class V, class VL> member(const std::string &tagname, V P::* m, const VL&); // コンストラクタ(3) template<class P, class V> member(const std::string &tagname, V P::* m, int minOccurs, int maxOccurs); // コンストラクタ(4) template<class P, class V, class VL> member(const std::string &tagname, V P::* m, const VL&, int minOccurs, int maxOccurs, bool emptiable = false); // デフォルト値指定 void set_default(const std::string &defval);

namespace xiso {
 struct leaf<foo> { 
  void model() { 
   member("member", &foo::member_,).set_default("default string");
  };
}

ポインタ型の使用

ポインタ型のメンバは、aka::deep_ptr<>によって、定義されるスマートポインタを用いて実装できます。

出現頻度は、自動的に、minOccurs=0, maxOccurs=1と限定されます。

ポインタ型のメンバには、struct ptrmemberを用います。これは、複雑型メンバの時と同様です。

struct ptrmember {
  // コンストラクタ(1)
  template<class P, class V>
  ptrmember(const std::string &tagname, V P::* m);
  // コンストラクタ(2)
  template<class P, class V, class VL>
  ptrmember(const std::string &tagname, V P::* m, const VL&);
};

コンストラクタ(1)では、第一引数は、タグ名、第二引数は、メンバへのポインタとなります。
コンストラクタ(2)また、追加して、第三引数として、leafクラスを指定することができます。第三引数として、deep_ptr<>が用いる値(deep_ptr<T>の場合、T型>)に対するleafクラスを指定します。

固定値(fixed)の使用

固定値は、単純型要素の値を定数とし、指定された値以外の値がXML文書中に存在した場合、パースエラーとします。固定値は、単純型の値クラスメンバに対してのみ、使用可能です。

固定値は、単に、決まった値が与えられたタグの出現のみをチェックするだけなので、値クラスにメンバを定義する必要はありません。leafクラスには、struct fixed_member<>テンプレートを用い、固定値メンバの出現を定義します。

template<class V>
struct fixed_member {
  fixed_member(const std::string &tagname, const std::string &fixed_value);
  template<class VL>
  fixed_member(const std::string &tagname, const std::string &fixed_value, const VL &);
};

固定値の配列の場合には、struct fixed_array<>テンプレートを用います。

struct fixed_array {
  template<class P, class V>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m,
               int minOccurs, int maxOccurs);

  template<class P, class V, class VL>
  fixed_array(const std::string &tagname, const std::string &fixed_value, V P::*m, const VL &,
                int minOccurs, int maxOccurs, bool emptiable = false);
};

固定値の配列の場合には、固定値として現れる子要素の数を知るために、値クラスには、コンテナを定義する必要があります。コンテナ内部に保持されるインスタンスの個数が、固定値配列の要素数となります。

また、シリアライズ時には、配列中のインスタンスの値個だけ、タグが出力されます。また、値クラスのメンバの値は、無視され、固定値で指定した値が出現します。デシリアライズ時には、固定値として指定された値を持つインスタンスが、子要素の出現個数分、格納されます。


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