【3/18〜】Amazon、VMwareが語る『クラウドの未来』 スラッシュドット    はてなブックマーク  Yahoo!ブックマークに登録  印刷
 

連載

.NETで簡単XML

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

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

Back Issue
1
XML超入門
2 プログラムでXML文書を作成する
3 XML文書を読み書きするプログラムの作成
4 DOM(Document Object Model)

5

DOMとXPath

6

.NETプログラムでXSLTスクリプトを使う

7

VS.NETでXML Schemaを活用する(作成編)

今回のサンプル・プログラムについて

 今回もサンプル・プログラムは、Visual Basic .NET(以下VB.NET)とC#で記述したものを用意した。VB.NETのサンプルを掲載するとともに、VB.NET、C#それぞれへのサンプルのリンクを張ってあるので、必要に応じてダウンロードしてほしい。開発環境としてはVisual Studio.NET 2003を使用することを前提にしている。

 サンプル・プログラムはすべてWindowsアプリケーションとしてプロジェクトを作成後に、フォームのLoadイベントに実行するコードを書き込み、Trace.WriteLineメソッドで結果を出力する。結果の確認は、統合開発環境の出力ウィンドウで行う(一部例外あり)。それぞれのソースの先頭には、以下のコードが書かれているものとする。

Imports System.Xml
VB.NETの場合

using System.Xml;
C#の場合

XML文書読み込み時にスキーマで内容チェック

 前回は、Visual Studio .NET(VS.NET)でスキーマを作成した。とはいえ、スキーマを作成しても、それだけでは何も起こらない。プログラムは何かの実行手順を記述したものなので、実行すれば何かが起こる。しかし、スキーマは定義なので、それ自身に何かを実行する手順は含まれない。では、プログラムからXML文書を読み込むときに、どのようにすればスキーマを使ったチェックができるのだろうか。

 以下に、DOMを使用してXML文書を読み込むプログラムに、スキーマによるチェックを追加するサンプル・プログラムを示す。

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
  Const schemaPath As String = "c:\AddressBook.xsd"
  Const documentPath As String = "c:\sample01.xml"
  Dim doc As XmlDocument = New XmlDocument
  Dim reader As XmlValidatingReader = New XmlValidatingReader( _
    New XmlTextReader(documentPath))
  reader.Schemas.Add(Nothing, schemaPath)
  reader.ValidationType = ValidationType.Schema
  doc.Load(reader)
End Sub
スキーマによるチェックを追加したサンプル・プログラム(VB.NET版C#版
プログラムで使用しているXML文書(sample01.xml)とXML Schema(AddressBook.xsd)は前回に作成したものだ 。

 見てのとおり、単にDOMのLoadメソッドに何かを指定するだけでチェックされる、というほど単純ではない。だが、過剰なほど複雑すぎるということもない。要点さえ分かれば、何ということはない。

 ポイントは2つある。1つは、スキーマによる検証を行う機能、つまりXmlValidationgReaderクラスを経由してXML文書を読み込むこと。もう1つは、XmlValidationgReaderクラスのインスタンスに、どのスキーマを使うかを指定してやることである。

 第1のポイントは難しくない。XmlDcoumentクラスのLoadメソッドは、引数にXmlReaderクラスを指定することができ、スキーマによる検証機能を持ったXmlValidatingReaderクラスはXmlReaderクラスを継承している、ということさえ理解すれば、容易に実現できるだろう。

Dim reader As XmlValidatingReader = New XmlValidatingReader( _
  New XmlTextReader(documentPath))

 問題は第2のポイントである。こちらの方は、あるXML文書に適用されるスキーマを発見するメカニズムを把握していないと実現することができない。これが、少々ややこしい。例えば、住所録のスキーマを作成したとして、住所録を書き込んだXML文書を検証させる場合、単純にXML文書とスキーマのファイル名を指定するだけでは済まないのである。その理由は、XML Schema固有の名前空間ごとにスキーマを指定するという特徴にある。XML Schemaでは、名前空間ごとにスキーマが存在し、XML文書内に記述された名前空間から検証に使うスキーマを探し当てて使うことになる。

 探し当てる具体的な方法は2つある。1つは、XML文書内にズバリある名前空間に対応するスキーマのURLを書いてしまう方法。しかし、今回のように応用ソフトが読み込むXML文書の妥当性を検証するには向かない方法である。スキーマは応用ソフト側で指定しなければ意図した検証にならない。もう1つは、スキーマのコレクションを使う方法である。

 スキーマのコレクションとは、そこにいくつものスキーマを入れておき、必要に応じて検証機能に参照させる役割を持つものである。XmlValidatingReaderクラスのSchemasプロパティで示されるものが、スキーマのコレクションである。今回はこれを使うことにする。

 XmlValidatingReaderクラスのSchemasプロパティを調べると、読み取り専用であるため、自分でスキーマを登録できないように思ってしまう人がいるかもしれないが、そうではない。SchemasプロパティはXmlSchemaCollectionクラスのインスタンスを参照するためのものである。読み取り専用ということは、このXmlSchemaCollectionクラスのインスタンスをプログラマーが自由に設定することはできないということであって、コレクションに追加できないという意味ではない。このインスタンスのAddメソッドを呼び出すことで、スキーマのコレクションに応用ソフトが必要とするスキーマを追加することができるのである。

 Addメソッドには、いくつかのバリエーションがある。ここで使用しているのは、string型の引数を2つ取るものである。第1引数はスキーマに関連付けられた名前空間URIを指定する。しかし、スキーマに書き込まれた名前空間URIをそのまま使う場合は、Nothing(VB.NETの場合)またはnull(C#の場合)を指定するだけでよい。第2引数は、読み込むスキーマを指定するURLである。ここではそのままファイル名を指定してしまっている。

reader.Schemas.Add(Nothing, schemaPath)

 実際に動作を見るために、このサンプル・プログラムを実行してみるとよいだろう。c:\AddressBook.xsdに、前回作成したXML Schemaのスキーマファイルを置き、c:\sample01.xmlに前回紹介したXML文書を置いておく。そして実行してみる。もし間違いがなければ、何ごともなくLoadメソッドの実行は完了し、ウィンドウが表示される。もし、スキーマに記述されたルールと、実際のXML文書に書き込まれた内容に食い違いがあれば、System.Xml.Schema.XmlSchemaException例外が発生して、そこで動作を止めることになる。実際に試す場合は、関係ない要素を書き加えたり必要な要素を削除したりして、わざと誤ったXML文書を作成して、それを使って試してみよう。そして、同程度のチェック機能を自分でプログラミングして作る場合、どれぐらいの手間が掛かるかを考えてみよう。


 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台以上! グループ内
サーバの「統合管理」によるメリットは?