忍坂2 リファレンス

赤紫蘇2 XML/C++ 忍坂2

akaxiso2.0-beta3


コマンドラインオプション

忍坂2の動作

チューニング

DTD->XMLスキーマ変換


忍坂2は、設定ファイル、もしくは、XMLスキーマ文書中に設定項目を追加することにより、ソースの生成時の詳細なオプションを設定することが可能です。

XMLスキーマ文書中における指定

XMLスキーマ文書中の<xs:appinfo>要素以下に、名前空間 http://akaxiso.sourceforge.jp/osixaka2/beta2 (最終リリースで変更あり)に属する要素を書くことで

  • 名前空間プレフィックス
  • インクルードファイルの指定
  • C++クラス名
  • 手実装により定義された単純型の値クラス、leafクラスの使用

の設定が可能です。

・名前空間に対する名前空間プレフィックスの指定(osx:namespace)

以下の形式にて指定を行います。

<osx:namespace prefix="名前空間プレフィックス" uri="名前空間URI">

uri属性は省略することができます。その場合、xs:schema要素の属性である@targetNamespace属性の値が用いられます。ここで指定される名前空間プレフィックスがC++ソースの名前空間名になります。

<osx:namespace>は、<xs:appinfo>の子要素として書いてください。また、<xs:annotation>は、最初の<xs:complexType>、もしくは、<xs:simpleType>の前に書いてください。

例:

my_uriで指定される名前空間に対して、名前空間プレフィックス、my_prefixを対応付ける。

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
      <osx:namespace prefix="my_prefix" uri="my_uri"/>
    <xs:appinfo>
  </xs:annotation>

 <!-- xs:complexType、xs:simpleTypeの定義 などなど-->

</xs:schema>

・インクルードファイルの指定(osx:include、osx:xiso_include、osx:ximpl_include)

値クラスファイル(osx:include)、leafクラスの宣言ファイル(osx:xiso_include)、leafクラスの実装ファイル(osx:ximpl_include)ファイル中でファイルをインクルードするための指定を行います。
以下に形式を示します。

<!-- 値クラスヘッダへのインクルード -->
<osx:include system="true|false">インクルードファイル名</osx:include>

<!-- leafクラスヘッダへのインクルード -->
<osx:xiso_include system="true|false">インクルードファイル名</osx:xiso_include>

<!-- leafクラス実装ファイルへのインクルード -->
<osx:ximpl_include system="true|false">インクルードファイル名</osx:ximpl_include>

それぞれ、@system属性(xs:boolean型)を持ち、この指定により、#includeの形式を以下に示すように選択することができます。

/* @system="true"が指定された時、 */
#include <ファイル名>

/* @system="false"が指定された時、*/
#include "ファイル名"

xs:include、xs:xiso_include、xs:ximpl_includeは、XMLスキーマ文書の<xs:appinfo>の子要素として書いてください、また、<xs:annotation>は、最初の<xs:complexType>、もしくは、<xs:simpleType>の前に書いてください。

<xs:schema xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2"
  xmlns:xs="http://www.w3.org/2001/XMLSchema">
  <xs:annotation>
    <xs:appinfo>
      <osx:include name="filename.h" system="true"/>
    </xs:appinfo>
  </xs:annotation>

<!-- xs:complexType、xs:simpleTypeの定義などなど。 -->

</xs:schema>

・生成されるクラス名の指定(osx:classname)

xs:complexType、xs:simpleType、xs:sequence、xs:choice、xs:allの属性として使用可能です。

通常、忍坂2は、XMLスキーマの@name属性で与えられる名前、もしくは、無名パーティクルに与えられる自動生成された名前を、C++のクラス名として用います。この名前を、osx:classname属性で上書きすることができます。

例1:

xs:complexTypeにosx:classnameを適用する。XMLスキーマ型の名前を"schema_type"、C++のクラス名を"cpp_type"とする。

<xs:complexType name="schema_type" osx:classname="cpp_type" 
  xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2"/>

例2:

ネストした無名のxs:sequenceに、C++のクラス名(cpp_sequence)を指定する。

<xs:complexType name="schema_type" xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
  <xs:choice>
    <xs:sequence osx:classname="cpp_sequence"/>
  </xs:choice>
</xs:complexType>

・手実装によるleafクラスの使用(osx:leaf)

単純型のクラス、leafクラスを別ファイルにて、宣言、実装しており、この定義を引用する際に用います。<xs:simpleType>の属性として使用可能です。

<xs:simpleType osx:leaf="leafクラス名"/>

osx:leafを使用する際には、単純型のC++値クラス名は、単純型の値クラスに対して忍坂2が与える名前と一致している必要があります。(例を参照)

例:

スキーマ中に単純型(my_simpleType)があり、この型に対して、妥当性検証、もしくは、特殊な追加処理を実装した値クラス(struct my_simpleType、struct my_simpleType_leaf"が、すでに実装されているものとする。XMLスキーマ文書中で、これらのクラスを引用し、ソース生成を行います。他のファイルに実装されている単純型のクラス、leafクラスを#includeにより読み込むため、<osx:include>、<osx:xiso_include>と併せて用います。

・C++側の実装

ファイル:my_simpleType.h----------------------------------------------

typedef long  my_simpleType; // my_simpleTypeは、long型の変数で表される。

------------------------------------------------------------------

ファイル:my_simpleType_xiso.h -------------------------------------------
#include "my_simpleType.h"
struct my_simpleType_leaf : aka::simpleType<my_simpleType, my_simpleType_leaf> {
  static void read_text(void *e, const std::string &entity, aka::entity_complements &ecomp);
  static void _write_text(const void *e, std::ostream &ostm, aka::entity_complements &ecomps);
};

-------------------------------------------------------------------

ファイル:my_simpleType_xiso.cpp------------------------------------------

// my_simpleType_leaf::read_text(), my_simpleType_leaf::write_text()の実装

-------------------------------------------------------------------


・スキーマファイル-------------------------------------------------------
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema" 
  xmlns:osx="http://akaxiso.sourceforge.jp/osixaka2/beta2">
  <xs:annotation>
    <xs:appinfo>
      <osx:include>my_simpleType.h</osx:include>
      <osx:xiso_include>my_simpleType_leaf.h</osx:xiso_include>
    </xs:appinfo>
  </xs:annotation>

  <!--例1 トップレベル要素としてのxs:simpleType -->
  <!-- トップレベル要素の名前がそのままC++値クラス名として使われる。 -->
  <xs:simpleType name="my_simpleType" osx:leaf="my_simpleType_leaf">
    <!-- xs:simpleTypeの実際の定義。忍坂2では無視される。
  </xs:simpleType>


  <!--例2 ローカル要素としてのxs:simpleType>
  <xs:complexType>
    <xs:sequence>
      <xs:attribute name="sample_attr">
        <!-- ローカルなxs:simpleTypeは、無名であるため、osx:cleassnameにて名前を与える。 -->
        <xs:simpleType osx:classname="my_simpleType" osx:leaf="my_simpleType_leaf"/>
      <xs:attribute>
     </xs:sequence>
  </xs:complexType>

</xs:schema>

設定ファイルによる指定

設定ファイルを用いて、デフォルトの設定を書き換えることができます。-Tオプションを用いて、設定ファイルのテンプレートを生成することができます。


$ osixaka2 -T template.xml

生成されるファイル(template.xml)の内容を以下にしめします。

<?xml version="1.0" encoding="Shift_JIS" standalone="yes"?>
<preference xmlns="http://akaxiso.sourceforge.jp/osixaka2/beta2">
  <format>
    <member prefix="" suffix="_"/>
    <array container="std::list" prefix="" suffix="_array"/>
    <choice container="std::list"/>
    <simplecontent valuename="value"/>
    <particle_item prefix="" suffix="_item"/>
  </format>
  <substitutions>
    <substitution original="token_to_substitute" substituted="substituted_token"/>
  </substitutions>
  <escapes>
    <escape to_escape="character_to_escape" escaped="escaped_character"/>
  </escapes>
  <directives/>
</preference>

・メンバ、クラス名のフォーマット(preference/format以下)

設定項目 要素 値の例
クラスメンバの書式 member_format @prefixで、メンバ名の接頭語を@postfixでメンバ名の接尾後を指定
<member_format prefix="m_"、postfix=""/>
とすると、m_member;のようなメンバ名が指定される。
配列のコンテナ array_container std::vector、std::listなど
aka:choiceのコンテナ choice_container std::vector、std::listなど
aka:simplecontent(xs:simpleContent)の値メンバ名 simplecontent @valuenameで指定された名前が、aka:simplecontentの値メンバ名として使用される。
minOccurs, maxOccursが指定されたxs:complexTypeの生成に使われる配列要素型の名前 particle_item @prefixで、メンバ名の接頭語を@postfixでメンバ名の接尾後を指定
<member_format prefix="m_"、postfix=""/>
とすると、m_member;のようなメンバ名が指定される。

・置換(preference/substitutions、preference/escapes以下)

設定項目 要素 値の例
トークン置換 preference/substitutions/
substitution
単語の置換。XML Schema内で指定される名前が、C++の予約語と重なるような場合に用いる。
<substitution original="class" substituted="_class"/>
とすると、classが、_classに置換される。
上記設定テンプレートで生成されるのは、ダミーの要素。
文字の置換(エスケープ) preference/escapes/escape '-'(ハイフン)など、XML Schemaで名前として使用可能な文字をエスケープする。
<escape to_escape="-" escaped="_"/>
と指定すると、"XML-Schema-Name"が、"XML_Schema_Name"と変換される。

・ディレクティブ(preference/directives)

設定項目 要素 値の例
名前空間指定 namespace 名前空間のプレフィックスとURIの対応付けを行う。

XMLスキーマ中に書かれるosx:namespaceと同書式

インクルードファイル指定 include、
xiso_include、
ximpl_include
生成されるファイルに#includeを挿入。
XMLスキーマ中に書かれるosx:include、osx:xiso_include、osx:ximpl_includeと同書式

・内部指定(internal)

実装詳細のチェック中

設定ファイルの使用

-Lオプションを用いて、作成された設定ファイルを使用します。


設定ファイルの使用
$ osixaka2 -L preference.xml <XML Schemaドキュメントファイル名>

仕様、制限、未実装部など

  • XMLスキーマ中の組込み型は、忍坂2により、C++クラスにマッピングされます。

  • xs:simpleTypeによる単純型の定義を用いた場合、生成される型は、std::stringのtypedef名となります。
    また、単純型の制限、拡張の定義について、妥当性検証ロジックはサポートされません。

  • 以下のタグ、属性は、サポートされません。
    • xs:keybase、xs:keyref、xs:substitutionGroup、mixed属性、xs:redefine、abstract属性、final属性、block属性、blockDefault属性

  • complexContent以下におけるrestrictionの定義に関して、制約チェックは、サポートされていません。サポート予定も未定です。

  • xs:include、xs:importの処理時に指定されるschemaLocation属性は、処理対象のスキーマファイルからの相対パスで記述されるものとします。


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