赤紫蘇 2.
忍坂2(α)
忍坂2は、XML-Schemaドキュメントから、シリアライザブルなクラスを生成するためのスキーマコンパイラです。
コマンドライン
osixaka2 [-p] [-d] [-o ディレクトリ名] <XML Schemaファイル>
オプション
| オプション文字 | 意味 |
|
-p |
スキーマファイルをパースするのみで終了する。 |
| -d | パースされたスキーマドキュメントを、シリアライズする。 |
| -o <ディレクトリ名> | 出力ディレクトリの指定。無指定の場合カレントディレクトリ |
例として、忍坂2による、XML Schemaのためのスキーマ文書生成について説明します。
XMLSchemaは、以下の二つのスキーマ文書により定義されています。
| 名前空間URI | ファイル名 | オリジナルスキーマのURL |
| http://www.w3.org/2001/XMLSchema | XMLSchema.xsd | http://www.w3.org/2001/XMLSchema.xsd |
| http://www.w3.org/XML/1998/namespace | xml.xsd | http://www.w3.org/2001/xml.xsd |
これらのファイルは、オリジナルのスキーマです。
忍坂2でのスキーマ生成では、以下の前処理を施す必要があります。
- スキーマ文書内のDTDを削除、もしくは、コメントアウト
- xs:include、xs:importなどで指定する外部スキーマ文書の位置を、処理対象となるスキーマ文書からの相対パスに変更
- XMLSchema.xsdの場合には、xs:includeで指定されるxml.xsdのパスを指定。
前処理を施したファイルは、akaxiso2/osixaka2以下にあります。このファイルを使用して、以下のコマンドを実行してください。
Windowsの場合(akaxiso2\binディレクトリにて)
akaxiso2\bin> osixaka2 ..\osixaka2\XMLSchema.xsd
Linuxの場合(akaxiso2/osixaka2ディレクトリにて)
$ ./osixaka2 XMLSchema.xsd
この操作により、element.h/xiso.h/xiso.cppの三つのファイルが生成されます。それぞれの内容を以下に示します。
| ファイル名 |
内容 |
| element.h | シリアライザブルなクラスの宣言 シリアライズ関数の宣言 |
| xiso.h | leaf<>クラスの宣言 |
| xiso.cpp | leaf<>クラスの実装 シリアライズ関数の実装 |
以上のファイルをコンパイルし、赤紫蘇ライブラリとリンクすることで、XML Schemaドキュメントのシリアライズ、デシリアライズが可能となります。デシリアライズ、シリアライズするためのサンプルコードは、osixaka2/test_main.cpp(HTML版)をご参照ください。
(Linuxであれば、osixaka2ディレクトリで、make parserを行うことで、ビルドできます。)
仕様、制限、未実装部など
- XML-Schema中の組込み型は、忍坂2により、C++クラスにマッピングされます。
対応表(赤紫蘇、忍坂2における組み込み型)を参照ください。
- XML-Schemaドキュメント中に書かれるDTDには対応していません。コメントアウトするか、削除してください。(osixaka2以下のディレクトリに存在する、XMLSchema.xsd、xml.xsdファイルは、あらかじめDTDをコメントアウトしてあります。)
- xs:simpleTypeによる単純型の定義を用いた場合、生成される型は、std::stringのtypedef名となります。
また、単純型の制限、拡張の定義について、妥当性検証ロジックはサポートされません。
- 以下のタグ、属性は、サポートされていません。
- xs:keybase、xs:keyref、xs:substitutionGroup、mixed属性、
- xs:keybase、xs:keyref、xs:substitutionGroup、mixed属性、
- 以下のタグ、属性は、未実装です。
- xs:redefine、abstract属性、final属性、block属性、blockDefault属性
- xs:redefine、abstract属性、final属性、block属性、blockDefault属性
- complexContent以下におけるrestrictionの定義に関して、制約のチェックは、未実装です。
- 赤紫蘇では、XMLSchemaで記述されるドキュメント構造を、より少ない数のクラスで表現できるようにしてあります。
このため、XML Schemaで定義される文書をそのまま、C++のクラスへと変換すると冗長な宣言になります。このため、忍坂2では、内部でドキュメント構造の単純化、最適化を行っています。このロジックについては、より、詳細な実装を行う予定です。
- xs:include、xs:importの処理時に指定されるschemaLocation属性は、処理対象のスキーマファイルからの相対パスで記述されるものとします。