« VS2008 XMLスキーマのプロジェクト取り込み | トップページ | XMLスキーマ定義に従ってXMLファイルを読み込む(1) »

2012年10月14日 (日)

プロジェクトにXMLスキーマを取り込む場合の注意点

プロジェクトにXMLスキーマを取り込む場合、まずXMLファイル自体の構造に注意を払うべきです。

以下のようなXMLファイルを例に実験してみます。

例1.ルート要素の直下にデータを含む要素が存在する
例1のXMLファイル
例2.ルート要素の子要素の配下に全てのデータを含む要素が存在する
例2のXMLファイル

これらのXMLファイルから、XSDコマンドを使用してXMLスキーマを作成してみました。
なおXSDコマンドの使い方は、スタートメニューに登録されている"Microsoft Visual Studio 2008"→"Visual Studio Tools"→"Visual Studio コマンドプロンプト"を実行して、そこから"XSD (XMLファイルのパス名) /out:(出力先フォルダ名)"を入力すればOKです。

例1の xml ファイルから生成した xsd ファイル
Ex1_21
例2の xml ファイルから生成した xsd ファイル
Ex2_21

構造が違うので、スキーマ定義も異なっているのは当然ですが、注目したいのはスキーマのルート要素に存在するid属性値です。
例1から生成した xsd ファイルでは、"NewDataSet"という元のXMLファイルにはない固定値が割り当てられます。C#のプロジェクトに取り込んだ際に自動生成されるDesiner.csファイルでは、DataSet のクラス名にこの値を使用します。

例1のxmlファイルから生成したDesiner.csファイル
Ex1_31
例2のxmlファイルから生成したDesiner.csファイル
Ex2_31

つまり例1のようなXMLファイル構造では、"NewDataSet"というクラス名のまま使用せざるおえない状況になってしまいます。勿論 Desiner.cs を直接手修正すれば、別のクラス名で使用する事は可能でしょうが、自動生成されるファイルである事を考慮すれば、これはやらない方が無難でしょう。

従って、データを含む要素は、その親要素がルート要素にならないような構造となるように設計すべきです。

さらに今回詳細な説明は省略しますが、実はもう1点注意すべき点があります。それは子要素を持つ要素は、子要素を持たない要素の後に来る様にするという点です。

例3.同じ階層で、全ての子要素を持つ要素が子要素を持たない要素の後に来るXML
例3のXMLファイル
例4.同じ階層で、子要素を持つ要素が子要素を持たない要素の後に来るとは限らないXML
例4のXMLファイル

XSDコマンドの仕様なのか知りませんが、例3と例4のXMLファイルに対して生成される xsd ファイルは全く同じ内容になります。そしてそのスキーマ内容は例3に従った内容となります。つまり例4の様なXMLファイルを使用すると、せっかくXMLスキーマを取り込んでも、それ自体が誤っているためにうまく機能しません。こちらも手修正すれば良さそうですが、やり方によってはうまく機能しない事が判っています。

とりあえず今回の話をまとめると、以下のようになります。

プロジェクト取り込み予定のXMLファイルの構造は、以下の点を注意すべきです。

  1. 全てのデータを含む要素は、その親要素がルート要素でないようにする事。
  2. 同じ階層の要素で、子要素を含む要素は、子要素を持たない要素の後になる構造にする事。

« VS2008 XMLスキーマのプロジェクト取り込み | トップページ | XMLスキーマ定義に従ってXMLファイルを読み込む(1) »

覚え書き」カテゴリの記事

コメント

コメントを書く

コメントは記事投稿者が公開するまで表示されません。

(ウェブ上には掲載しません)

トラックバック


この記事へのトラックバック一覧です: プロジェクトにXMLスキーマを取り込む場合の注意点:

« VS2008 XMLスキーマのプロジェクト取り込み | トップページ | XMLスキーマ定義に従ってXMLファイルを読み込む(1) »