連載

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


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 記事ランキング

本日 月間