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

赤紫蘇2における単純型はテキスト値により表されます。XML文書中では、タグに囲まれたテキスト、もしくは、属性値として現れます。

以下のリストをご参照ください。

<?xml version="1.0"?>
<foo> この部分は混合モードテキスト
  <value1>この部分は単純型で記述可能</value1>  この部分も混合モードテキスト
</foo>

このXML文書中で、赤紫蘇2データモデルが扱うことができるは、<value1>タグで囲まれた部分のみです。それ以外のテキスト値は、混合モードテキストなので、無視されます。つまり、内部にタグを含まないテキスト値が、使用可能ということです。

この部分のテキスト値については、赤紫蘇2内部で、C++クラスの値とテキスト値の相互変換を行うためのメカニズムが実装されています。実際の型がXMLスキーマの組み込み型にマッピングされている場合、赤紫蘇2内部の実装により、部分的に、妥当性検証を行い、C++の値クラスへと変換を行うことが可能です。

また、ユーザ定義の単純型の場合には、必要に応じ、ユーザが、C++値クラスへの変換や、妥当性検証を行うコードを実装することとなります。

単純型の定義

単純型に対するleafクラスは、aka::simpletype<>クラスを用いて定義します。

template<class V, class L=xiso::leaf<V> > 
struct simpletype {
  static void read_text(void *elm, const std::string &entity, aka::entity_complements &ecomp);
  static void write_text(const void *elm, std::ostream &ostm, aka::entity_complements &ecomp);
};

ユーザは、read_text()、write_text()メソッドを用いて、単純型のテキストへの書き出し、テキストの読み込みを実装します。

赤紫蘇2の組み込み型については、あらかじめleafクラスの実装が提供されています。5. 組み込み型をご参照ください。

read_text()メソッドの第一引数は、void*で渡される値クラスのインスタンスへのポインタです。これを、V型にキャストして用います。istmには、読み込むべき文字列が設定されています。

また、write_text()メソッドの第一引数は、void *で渡される値クラスインスタンスへのポインタです。これも同様に、V型にキャストし、ostmで渡される出力ストリームにテキストとして書き出します。

aka::entity_complementsクラスは、単純型のテキストの読み込み、テキストへの書き出しを行う際の補足情報を提供します。現在のところ、名前空間とそのプレフィックスの対応が参照可能です。また、xs:ID型のテキスト値に対する値チェック機能が使用可能です。必要に応じ、ユーザ定義の補足情報を定義することが可能です。

値の読み込み、書き出しに失敗した場合には、例外として、aka::error()クラスをthrowしてください。

簡単な例として、long型のleafクラスの定義を以下にしめします。

namespace xiso { 
  template<>
  struct leaf<long> : aka::simpletype<long> {
    static void read_text(void *elm, const std::string &entity, aka::entity_complements &ecomp) {
      V &v = *static_cast<V*>(elm);
      aka::isstream(entity);
      istm >> v;
      if (istm.fail())
        throw aka::error("Failed to parse long value.", __FILE__, __LINE__);
    }

    static void write_text(const void *elm, std::ostream &ostm, aka::entity_complements &ecomps) {
      const V &v = *static_cast<const V*>(elm);
      ostm << v;
   }
};

read_text()、write_text()内部の実装により、値の範囲チェックや形式チェックなどを行うことで、妥当性検証を行うことができます。

memberの指定に後続して、デフォルト値を設定できます。以下の例では、foo::member_メンバのデフォルト値として、"default string"を指定しています。

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


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