赤紫蘇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_deserializerクラスとして実装しています。

aka::xml_deserializerは、aka::xml_serializerと同様、いくつかのクラスのtypedef名であり、実体となるクラスは、それぞれ、異なるXMLパーサライブラリを使用しています。それぞれのXMLパーサに対応して、デシリアライザクラスが定義されています。

シリアライザクラス名 エンコーディング変換エンジン
aka::expat_deserializer expat (babelが使用できれば文字コード変換エンジンとしてbabelを使用。)
aka::xerces_deserializer Xerces-C++のSAX2パーサを使用。(ICUを使用する設定でXerces-C++がコンパイルされていれば、文字コード変換エンジンとしてICUを使用。)

上記のクラスのどちらかが、以下のルールに従い、aka::xml_deserializerクラスへとtypedefされます。

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

2.Xerces-C++を使用しない場合。(AKAXISO2_USE_XERCESCが#defineされていない場合)
aka::expat_deserializerが、aka::xml_deserializedrとなります。

また、Xerces-C++を使用する場合でも、aka::expat_deserizlierは使用可能です。

デシリアライザの使い方

デシリアライザクラスをラップしたデシリアライズ関数(aka::deserialize())が、使用可能です。簡単な使用例については、以下のとおりです。

/* 標準入力を用いデシリアライズする。 */
aka::document doc = aka::deserialize(std::cin);

デシリアライザを用いた場合には、以下のとおりとなります。

aka::xml_deserializer deser;

/* 標準入力を用いデシリアライズする。 */
aka::document doc = deser.deserialize(std::cin);

デシリアライズ関数、デシリアライズメソッドは、入力形式により、いくつかのオーバーロード版が定義されています。詳細に関しては、2.ライブラリAPIをご参照ください。

デシリアライズ時の名前空間処理

デシリアライズ時には、パーサと赤紫蘇2のデシリアライザエンジンが内部で名前空間処理を行います。通常のユーザプログラム中において、特別考慮することはありません。

ただし、QNameのデシリアライズするように、名前空間プレフィックスに基づいた処理が必要な場合には、考慮が必要となります。以下のXML文書を例として考えます。

<?xml version="1.0">
<sample xmlns:aka="http://akaxiso.sourceforge.jp">
   <child name="aka:test"/>
</sample>

もし、child@nameが、xs:stringやxs:tokenなど、通常の文字列である場合には、問題ありません。

しかしながら、child@nameが、QNameである場合、'aka'という名前空間プレフィクスが、"http://akaxiso.sourceforge.jp"というURIを対応付けて、解釈しなければなりません。

このためには、デシリアライザエンジンから、名前空間プレフィックスと名前空間URIの対応付けを取得する必要があります。この情報は、デシリアライザエンジンが管理するentity_complementsクラスにより取得が可能です。また、entity_complementsクラスのインスタンスは、aka::simpletype::read_text()メソッドの引数として渡されています。eneity_complementsクラスには、get_prefixes()というaka::prefixesクラスのインスタンスを返すメソッドがあります。このインスタンスから、対象となるURIを取得することができます。

注)

デシリアライズ対象であるXML文書中で現れる名前空間プレフィクスを、後から取得をするという手法も考えられますが、NS1.1の仕様の特性(名前空間プレフィクスは上書き可能、また、子要素で宣言される名前空間は、その要素の終了時に無効となる。)から、赤紫蘇2では、行うことができません。


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