以下、忍坂2の動作について説明します。
・生成される要素
・忍坂2が行う処理
・ファイル生成オプション
生成される要素
以下のクラス、関数のソースが生成されます。
C++値クラス |
|
- 値を保持するC++クラスの定義です。
- 生成されるファイルは、値クラスの宣言を含むヘッダファイルとなります。
- ファイル名は、XMLスキーマ文書名を用いて、"<スキーマ文書名>.h"となります。
|
leafクラス宣言、定義 |
|
- C++値クラスに対応するleafクラスの宣言、定義を生成します。
- leafクラスの宣言が生成されるヘッダファイルの名前は、"<スキーマ文書名>_xiso.h"となります。
- leafクラスの実装が生成されるcppファイルの名前は、"<スキーマ文書名>_xiso.cpp"となります。
|
leafクラスのインスタンシング、名前空間の登録を行う関数の宣言、定義 |
|
- leafクラスのinitialize()メソッドを順次呼び出し、XML型情報を登録したり、名前空間プレフィックスとURIを対応付けるための処理を実装する関数(instantiate_xiso())の宣言、実装を生成します。
- 生成されるファイルの名前は、ファイル生成オプションにより異なります。
|
シリアライズ関数の宣言と定義 |
|
- グローバル名前空間にserialize()関数の宣言と定義を生成します。
- serialize()関数は、関数オーバーロードを用いて定義され、ルートクラス、std::ostreamのインスタンスを渡すだけで、シリアライズを行います。
- 生成されるファイルの名前は、ファイル生成オプションにより異なります。
|
忍坂2が行う処理
忍坂2が行う処理は以下のようになります。
XMLスキーマ文書のデシリアライズ |
|
- XMLスキーマ文書がデシリアライズされC++オブジェクトツリーへと変換されます。(デシリアライザは赤紫蘇2を使って実装されています。)
- この際、<xs:include>、<xs:import>で外部ファイルを読み込みます。外部ファイルのパスは、@schemaLocation属性を用いて示します。ファイルが存在するパスからの相対パスで記述します。
|
XMLスキーマデータモデルから赤紫蘇データモデルへの変換 |
|
- XMLスキ−マのデータモデルを赤紫蘇2データモデルへと変換します。
|
赤紫蘇データモデルの最適化 |
|
- データモデルの変換中に発生する冗長なクラスや、XMLスキーマ文書中の定義の冗長な構造を最適化し、生成されるクラス数を減らします。
- デフォルトで有効にされています。(-a0オプションで最適化無効)
|
ソース生成 |
|
- 構築されたデータモデルからソースファイルを生成します。
- ファイル生成のオプションは、-f、-n です。詳細は後述します。
- メンバ名、クラス名の命名規則は、設定ファイル(-Lオプションを用いて読み込み)を用いて変更することができます。
|
ファイル生成オプション
忍坂2のファイル生成には、以下の二つのやり方があります。
・all-in-one型
ひとつ、もしくは、複数のXMLスキーマドキュメントをまとめて処理し、値クラスヘッダファイル(*.h)、leafクラスヘッダファイル (*_xiso.h)、leafクラス実装ファイル(*_xiso.cpp)の三つのファイルを生成します。<xs:import>を用い、複数のXMLスキーマ文書を読み込み、複数の名前空間を同時扱っている場合でも、以上の三つのファイルに、全内容が生成されます。ファイルは、XMLスキーマの文書名を用いて名づけられます。
また、instantiate_xiso()関数や、seirlize()関数についても、宣言は値クラスヘッダファイルに、実装はleafクラス実装に含まれます。
例:
osixaka2ディレクトリ中のXMLSchema.xsdを用いた場合の、ファイル生成の実行例
$ osixaka2 XMLSchema.xsd
XMLSchema.xsdは、xml.xsd(XML名前空間内の定義)、osx.xsd(忍坂名前空間内の定義)を読み込み、XMLSchema.h、XMLSchema_xiso.h、XMLSchema_xiso.cppに、ソースを生成します。
・分割ソース生成
XMLスキーマ文書が定義する名前空間ごとに、値クラスヘッダファイル(*.h)、leafクラスヘッダファイル(*_xiso.h)、leafクラス実装ファイル(*_xiso.cpp)を別個に生成します。
また、instantiate_xiso()関数や、serialize()関数についても、別個に、ヘッダ、実装ファイルが生成されます。
名前空間ごとのクラス宣言、leafクラス宣言、実装を生成するためには、osixaka2の実行時に-nオプションをつけます。
また、instantiate_xiso()関数、serialize()関数の宣言、実装を生成するためには、-fオプションを用います。-fオプションは、出力ファイル名を引数としてとります。
例:
osixaka2ディレクトリ内のXMLSchema.xsdを用いた場合のファイル生成の実行例
# クラス宣言定義の生成(-nオプション使用)
$ osixaka2 -n XMLSchema.xsd
$ osixaka2 -n xml.xsd
$ osixaka2 -n osx.xsd
# instantiate_xiso()、serialize()関数の生成 (-fオプション使用)
$ osixaka2 -f serializer XMLSchema.xsd xml.xsd osx.xsd
-nオプションをつけ、実行することで、XMLスキーマ、XML、忍坂2の名前空間に対応するクラスが生成されます。また、最後のコマンドで、serializer.h/.cppファイルに、instantiate_xiso()、serialize()関数が生成されます。