連載

.NETで簡単XML

第8回 VS.NETでXML Schemaを活用する(動作編)

株式会社ピーデー 川俣 晶
2003/09/27
Page1 Page2 Page3 Page4

スキーマからデータセットを作成

 XML SchemaとVS.NETを使うと、単なるXML文書の検証とは別の興味深い機能を使うことができる。それは、XML文書を扱うプログラムを、より容易に記述するための1つの方法である。

 例えば、スキーマに書かれた「個人」要素内の「名前」要素にアクセスするために「〜.個人[i].名前」というような式を書くことができてしまう方法である。XmlReader/WriterやDOMと比べると、驚くほど異なるスタイルの方法である。

 では、これを実現するサンプル・プログラムを作成する手順を説明しよう。

 まず、Windowsアプリケーションの新規プロジェクトを作成する。そして、[プロジェクト]メニューから、既存項目の追加を選ぶ。C#の場合は、そのままではXML Schemaのファイル(拡張子.xsd)が表示されないので、ファイルの種類として「すべてのファイル (*.*)」を選ぶ。そして、すでに作成済みのAddressBook.xsdを指定する。AddressBook.xsdファイルがプロジェクトに追加されたら、ソリューション・エクスプローラでAddressBook.xsdをダブルクリックし、これを開く。すると、スキーマのグラフィカルな表示が見られることだろう。これを表示させた状態では、メニューに[スキーマ]が追加されている。この[スキーマ]メニューから[データセットの作成]を選んで、[データセットの作成]にチェックを入れる。この時点で、自動的に「〜.個人[i].名前」というような式を可能とするためのソース・コードが自動的に生成されている。

 このソース・コードを見るには、以下の手順を踏む。まず、ソリューション・エクスプローラの上部にある「すべてのファイルを表示」というツール・チップが表示されるボタンをクリックする。次に、AddressBook.xsdの左横の+記号をクリックする。そこで表示されるAddressBook.vb(AddressBook.cs)をダブルクリックする。すると自動生成されたコードが表示される。これがXML文書の詳細を知らなくてもXML文書を扱えるように自動生成されたコードである。もちろん、使うだけなら、内容の詳細を読む必要はない。

 さて、この自動生成されたコードを利用するサンプル・プログラムとして以下のようなものを記述してみた。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Dim addressBook1 As 住所録 = New 住所録
  addressBook1.個人.Add個人Row("A0001", "二平二郎", "足立区1-2-3")
  addressBook1.個人.Add個人Row("A0002", "三陸三郎", "板橋区4-5-6")
  addressBook1.個人.Add個人Row("A0003", "四日市四郎", "江戸川区7-8-9")

  Trace.WriteLine("addressBook1の内容")
  For i As Integer = 0 To addressBook1.個人.Count - 1
    Trace.WriteLine(addressBook1.個人(i).ID)
    Trace.WriteLine(addressBook1.個人(i).名前)
    Trace.WriteLine(addressBook1.個人(i).住所)
  Next

  addressBook1.WriteXml("c:\result01.xml")

  Dim addressBook2 As 住所録 = New 住所録
  addressBook2.ReadXml("c:\result01.xml")

  addressBook2.個人.Add個人Row("A0004", "五反田五郎", "目黒区10-11-12")
  addressBook2.個人(0).住所 = "大田区13-14-15"
  addressBook2.個人.Remove個人Row(addressBook2.個人(1))

  Trace.WriteLine("addressBook2の内容")
  For Each r As 住所録.個人Row In addressBook2.個人
    Trace.WriteLine(r.ID)
    Trace.WriteLine(r.名前)
    Trace.WriteLine(r.住所)
  Next

  addressBook2.WriteXml("c:\result02.xml")
End Sub
自動生成されたソース・コードを用いるサンプル・プログラム(VB.NET版C#版

 これを実行すると以下のようになる(システムのメッセージが途中に割り込む場合もあるが、その際は読み飛ばしてほしい)。

addressBook1の内容
A0001
二平二郎
足立区1-2-3
A0002
三陸三郎
板橋区4-5-6
A0003
四日市四郎
江戸川区7-8-9
addressBook2の内容
A0001
二平二郎
大田区13-14-15
A0003
四日市四郎
江戸川区7-8-9
A0004
五反田五郎
目黒区10-11-12
サンプル・プログラムの出力

 このソースを見て、びっくりした人も多いだろう。英語と日本語が入り交じったソースになっている。しかも、「Add個人Row」のように、1つのキーワードの中に英語と日本語が入り交じっているものさえある。なぜ、そのようなソースになったのか、その理由はスキーマの定義を基に自動的に生成されたソース・コードを利用しているためである。Add+要素名+Rowというルールでメソッド名を自動生成する場合、要素名が日本語なら、必然的に上のような名前になってしまうのである。

 もしソースをきれいにまとめたいなら、スキーマを定義する時点ですべて英語を使うという方法もあるが、プログラムの都合でスキーマの内容をねじ曲げるのはあまり美しくない。スキーマは複数のプログラム間で共通に使われるものなので、1本のプログラムの都合で変更するのは好ましくないのである。ここでは、こういう日英混在キーワードのソース・コードもありではないか? ということで話を続けてみよう。

 サンプル・プログラムを見ると、まず住所録クラスのインスタンスを作成していることが分かるだろう。これが、1つの住所録XML文書に対応するものとなる。住所録クラスはスキーマに対応して自動生成されたクラスである。

Dim addressBook1 As 住所録 = New 住所録

 これに新しい個人要素を追加するには、

addressBook1.個人.Add個人Row("A0001", "二平二郎", "足立区1-2-3")

というようなメソッド呼び出しを行う。addressBook1は住所録クラスのインスタンス。これに含まれる個人プロパティは個人要素に関するオブジェクトを返す。そして、このオブジェクトが持つ「Add個人Row」メソッドにより、個人要素が追加される。このメソッドには3つの引数がある。最初はID、2番目は名前、3番目は住所である。個人要素が3つの情報を持つことはスキーマから明らかなので、それに対応する3つの引数を持つメソッドが自動生成されているのである。

 さて、個人プロパティのデータ型となる個人データテーブル・クラスは、それに含まれる項目数を示すCountプロパティとインデクサを持っている。そこで、Forループですべての個人要素に対応する情報にアクセスするというコードも容易に書くことができる。その際、インデクサのデータ型である「住所録.個人Row」クラスは、ID、名前、住所といったスキーマに書かれた名前に対応するプロパティを持っているので、それを使ってそれぞれの情報にアクセスすることができる。例えば、i番目の個人要素に含まれる名前要素の内容は、「addressBook1.個人(i).名前」といった式で取り出すことができる。

For i As Integer = 0 To addressBook1.個人.Count - 1
  Trace.WriteLine(addressBook1.個人(i).ID)
  Trace.WriteLine(addressBook1.個人(i).名前)
  Trace.WriteLine(addressBook1.個人(i).住所)
Next


 INDEX
  .NETで簡単XML
  第8回 VS.NETでXML Schemaを活用する(動作編)
    1.XML文書読み込み時にXML Schemaで内容をチェックする
  2.スキーマからデータセットを作成する(1)
    3.スキーマからデータセットを作成する(2)
    4.データセットを作成できない場合
 
インデックス・ページヘ  「連載 :.NETで簡単XML」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間