【2/17】今年は「濃厚」技術トーク!@ITメールセミナー スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
   

連載

.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」

ホワイトペーパーTechTargetジャパン

Insider.NET フォーラム 新着記事

@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

RSSフィード

スキルアップ/キャリアアップ(JOB@IT)

- PR -
- PR -

お勧め求人情報

キャリアアップ 〜JOB@IT
@IT Special -PR-
  企業の仮想化に足りない“発想”とは?
仮想化運用管理のキモは意外なところに!

New!
  操作もマニュアルも分かりやすい!
ユーザー視点で開発されたPC管理ツール

New!
  仮想化すればコストは削減できるか?
仮想化に必要な「3つの視点」を解説する

  セキュリティを知り尽くす上野氏が登壇!
@ITメールソリューションLive! in Tokyo

  運用管理の課題を“2つの観点”から分析
ユーザー満足度の高い「仮想環境」とは?

  世界に通用するストレージの作り方とは?
製品に込めた思いを富士通の開発者に聞く

  OSSで手間も時間も、障害も減った――
「マピオンの事例」オープンソース活用法

  「ノートPCの持ち出し禁止」で大丈夫?
情報漏えいを防ぐ管理手法とインフラは?

  1日の処理を1秒に――MySQLの達人が語る
「コスト削減」できるチューニング

  ドキュメント作成を自動化して、SEの作業
効率を大幅アップ! Visio 2007の魅力

  急速に広がるHyper-Vでのサーバ仮想化
そのベストプラクティスをデルが解説

  @IT主催セミナーで語られた、「担当者に
求められるセキュリティ対策」をレポート

  @IT「Windows 7」 特設サイトオープン!
最新情報・移行ノウハウを公開しています