![]() |
赤紫蘇2.リファレンス |
||||||||
|
デシリアライズ |
|||||||||
| akaxiso2.0-beta2 | |||||||||
|
|
|||||||||
赤紫蘇2は、デシリアライザをaka::xml_deserializerクラスとして実装しています。 aka::xml_deserializerは、aka::xml_serializerと同様、いくつかのクラスのtypedef名であり、実体となるクラスは、それぞれ、異なるXMLパーサライブラリを使用しています。それぞれのXMLパーサに対応して、デシリアライザクラスが定義されています。
上記のクラスのどちらかが、以下のルールに従い、aka::xml_deserializerクラスへとtypedefされます。 1.Xerces-C++を使用する場合。(AKAXISO2_USE_XERCESCが#defineされている場合) 2.Xerces-C++を使用しない場合。(AKAXISO2_USE_XERCESCが#defineされていない場合) また、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では、行うことができません。 。 |
|||||||||
