赤紫蘇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は、シリアライザをaka::xml_serializerクラスとして実装しています。

正確には、aka::xml_serializerは、いくつかのクラスのtypedef名であり、実体となるクラスは、それぞれ、異なる文字コード変換エンジンを持っています。それぞれの文字コード変換エンジンに対応して、シリアライザクラスが定義されています。

シリアライザクラス名 エンコーディング変換エンジン
aka::default_serializer ナシ
aka::babel_serializer babel
aka::xerces_serializer Xerces-C++のTranscoderクラス

上記のクラスのうちのひとつが、以下のルールに従い、aka::xml_serializerクラスへとtypedefされます。

1.Xerces-C++を使用する場合。(AKAXISO2_USE_XERCESCが#defineされている場合)
aka::xerces_serializerが、aka::xml_serializerとなります。

2.babelを使用するが、Xerces-C++は使用されない場合。(AKAXISO2_USE_XERCESCは#defineされていず、AKAXISO2_USE_BABELが#defineされている場合)
aka::babel_serializerが、aka::xml_serializerとなります。

3.babelもXerces-C++も使用しない場合。(AKAXISO2_USE_XERCESCもAKAXISO2_USE_BABELも#defineされていない場合。)
aka::default_serializerが、aka::xml_serializerとなります。

また、上記ルールにかかわらず、対応する文字コード変換エンジンが使用可能な場合、それぞれのシリアライザクラスを、直接使用することも可能です。(たとえば、Xerces-C++を使用する場合でも、バベルが使用可能であれば、aka::babel_serizlierは使用可能。)

シリアライザの使い方

aka::xml_serializerクラスを作成し、serialize()メソッドを呼び出すことでシリアライズが可能です。
最も簡単な使用法については、以下のサンプルをご参照ください。

aka::xml_serializer serializer;
/* ドキュメントのルートインスタンス  ドキュメント名はaka::doctype()を用いて"root"と定義されているものとする。*/
root r;

/* 適当にrを設定 */
r .....

/* std::coutにシリアライズしたドキュメントを出力 */
serializer.serialize(r, "root", std::cout);


シリアライズ時の名前空間指定

aka::xml_serializerは、それぞれのインスタンスごとに、名前空間出力時の設定を個別に保持することができます。

また、シリアライズ時の名前空間の扱いは、Namespaces in XMLの仕様に基づいています。バージョン1.0と1.1の二つが規定されています。(以降、NS1.0、NS1.1と呼びます。)

NS1.0では、ルート要素で名前空間プレフィクスの宣言を行い、それ以外の場所で名前空間の宣言を行うことができません。
また、NS1.1では、子要素中でも、名前空間プレフィクスの宣言が可能です。

赤紫蘇2は、NS1.0、NS1.1の両者の方法で、シリアライズを行うことができます。それぞれの方法について説明します。

NS1.0スタイルのシリアライズ

以下の指定を、シリアライズ前に行う必要があります。

  • aka::xml_serializer::enable_ns11()メソッドを用いて、NS1.1スタイルでの名前空間宣言を抑制します。(デフォルトでは、NS1.1スタイルが有効になっている。)

  • ドキュメント中に現れる「すべての」名前空間をルート要素中で宣言するための指定を、aka::xml_serializer::using_prefix()メソッド、もしくは、aka::xml_serializer::using_uri()メソッドを用いて行います。

    注)もし、宣言されていない名前空間に属する要素が、子要素中に存在した場合、シリアライズは正常終了しますが、生成されたXML文書は、妥当な形式ではありません。

aka::xmlns("aka", "http://akaxiso.sourceforge.jp");

/* シリアライザの作成 */
aka::xml_serializer serializer;

/* NS1.1スタイルを無効にする。*/
serializer.enable_ns11(false);

/* 名前空間プレフィクス"aka"と対応する名前空間URI("http://akaxiso.sourceforge.jp")を */
/* ルート要素で宣言するための指定。 */
serializer.using_prefix("aka");

/* もしくは、URI(http://akaxiso.sourceforge.jp")に対応する名前空間プレフィクス'aka'を */
/*指定することもできる。*/
/* serializer.usin_uri("http://akaxiso.sourceforge.jp"); */

/* シリアライズ */
serializer.serialize(root, "タグ名", std::cout);

NS1.1スタイルのシリアライズ

NS1.1スタイルでは、子要素の名前を調べ、必要な名前空間の宣言を自動的に生成します。また、NS1.1スタイルは、デフォルトで有効です。このため、特別な操作は必要ありません。

/* シリアライザの作成 */
aka::xml_serializer serializer;
/* シリアライズ */
serializer.serialize(root, "タグ名", std::cout);

注) 子要素の名前を調べて、名前空間の宣言を行います。しかし、要素値については、チェックを行いません。xml_serializer::using_prefix()、xml_serializer::using_uri()を用いて、明示的に、名前空間の宣言を生成してください。


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