【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  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-
  TomcatやJBossなどAPサーバ環境に関する
情報を集約! “業務”用APサーバ大百科

New!
  一気に解説! 最新のクラスタストレージ
「RAIDを超えたストレージ基準」……など

New!
  クラウド的ユーザー体験の変化は脅威か?
仮想化技術を使いこなす運用管理術を紹介

New!

  上司や部下、部署内メンバーとの情報共有
を“ガラッ”と変えるコラボツールとは?

New!
  おばかアプリ選手権、第4弾開催中!!
ムダにカッコよくてくだらない作品求ム!

  社内ファイルサーバを“クラウド”に統合
VPN直結「クラウド型ストレージ」を紹介

  Twitterのアカウントはなぜ突破された?
メールによる新手の攻撃手法とその対策

  もう仮想化のお試しフェイズは終わりだ!
Hyper-V 2.0が基幹システムも仮想化

  美人!? まあまあ? 気になる いやし系!!
PV急増で「美人時計」がとった手段とは?

  クライアント企業から求められる人材
⇒IT技術と経営戦略を併せ持つ「戦略家」

  .NET編集長が実践する「技術情報検索術」
サンプル・コードを簡単に探す“技”は?

  業務効率と情報セキュリティ対策を両立!
手間なく確実に機密情報を守る方法とは?

  進化を続ける富士通ストレージETERNUS DX
製品開発者の自信を裏付けるものとは何か

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

  【CTC事例】約30の基幹システムを統合!
膨大なバッジジョブを制御した方法は?

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

  その数、なんと400台以上! グループ内
サーバの「統合管理」によるメリットは?