パラサを失ってから - After Parasa

注意書き


10/14/2002

XML Schema Datatypes の型へのマッピング

XML Schema Part2: Datatypes にはさまざまな SimpleType が定義されているわけですが、これをそれぞれC++の型(クラス)として扱うことを考えます。これにより、或る XML データベースに対する問い合わせの結果セットを、それぞれの要素や属性の値をプロパティとして持つデータクラスのコレクションとして扱えるようになるはず。

XML 文書として入出力することを考え、各クラスは、文字列型での入出力関数を備えることとします。すると各プロパティクラスの基底クラス XSDBaseType は以下のようになります。

XSDBaseType
class XSDBaseType {
  virtual void fromString( std::string src ) = 0;
  virtual std::string toString() const = 0;
};

これをそれぞれの SimpleType に合わせて継承するわけですが、Type によって全然動きが違うので、いちいち継承してたら継承階層が広くなるのが使いにくそう。

そこで、 template を使ってみることにします。

XSDType
template<typename T>
class XSDType : public XSDBaseType {
public:
  XSDType();
  ~XSDType();
  void fromString( std::string src ) {
    rawdata = source;
  }
  std::string toString() const {
    return rawdata;
  }
  T& getRaw() const { return rawdata; }
  void setRaw( const T& data ) { rawdata = T; }
private:
  T rawdata;
};

上記のように、XSDType を定義し、それぞれの SimpleType が内部で持つべき C++ 型に合わせて特殊化します。

XSDType<bool>
template<> XSDType<bool>::fromString( std::string source )
{
  if ( source == "true" || source == "1" ) {
    rawdata = true;
  } else {
    rawdata = false;
  }
}

template<> std::string XSDType<bool>::toString()
{
  if ( rawdata ) {
    return "true";
  } else {
    return "false";
  }
}

あとは、typedef しておけばサクサク使える。

typedef
typedef XSDType<bool>         XsBoolean;

なんでこんなことをしているのかというと、要素名から自動的に自分の型を判別してデータクラスに保持することがやりたいので。その辺は次回時間があったら。


ログ


最近の巡回先