赤紫蘇2.リファレンス

デシリアライズ

akaxiso2.0-beta2


赤紫蘇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プロジェクトページへ