連載

.NETで簡単XML

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

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

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

5

DOMとXPath

6

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

スキーマはプログラマーに何をもたらしてくれるのか

 今回は、前回までとはがらっと趣向が変わる。前回までは、XML文書をプログラムから扱う操作手順が主な対象だった。しかし、今回解説するXML Schemaは操作手順ではなく、XML文書の定義を扱うものである。いうまでもなく、XMLは「言語を造る言語」という位置づけになるメタ言語であって、どんな要素や属性を用いて何を表現するかは全く決められていない。例えば、nameという名前の要素を人名を表現するために使う(決して会社名ではない!)ということは、XMLを利用してデータを扱う前にしっかり決めておかねばならない。このような決定は、あらゆる業務で使用するすべてのXML文書に要求されることである。さらに広い範囲で利用される標準言語であれば、誰もが納得いく説得力のある決定を行い、可能な限りあいまいさを排除した形で世間に広める必要がある。そのような状況で役に立つものが、いわゆるXMLのスキーマ言語というものである。

 ここで、そんな大それた機能は自分には必要ないと思ったプログラマーもいると思う。ただXML文書を読み込んで処理できればよいので、スキーマなどという難しいものは必要ないと思ったかも知れない。だが、それは大きな勘違いというものである。スキーマは直接的にプログラマーにメリットをもたらすのである。

 例えば、あるXML文書を読み込むプログラムを作成する場合、当然のことながらさまざまな異常入力に対処することが要求される。常に正しい入力があると期待することは現実的ではない。実際には、書き間違いがあったり、通信回線で文字が化けたり、バグのあるプログラムが誤ったXML文書を出力することもある。趣味の世界ならともかく、ある程度の信頼性を要求される実用プログラムなら、不正な入力に対して適切なエラーを表示し、誤ったデータのまま処理が進まないようにしなければならない。

 XMLの基本的な構文の誤りはXMLを扱うライブラリが検出する。しかし、要素や属性の名前、並び順といった人間が決定するルール(仕様)のチェックはライブラリに任せられない。スキーマを使い、これらのルールを定義することで、処理するXML文書がそれに適合するかどうかを容易にチェックできるのである。

XML Schemaとは何か?

 スキーマの価値が分かったところで次の問題は、この世界にはどんな種類のスキーマ言語があって、どれを使うべきか、ということである。まず、最も歴史が長く有名なものがDTD(Document Type Definition)である。これはXMLそのものを定義するXML1.0勧告の一部として記述されたものであり、極めて広範囲にこれをサポートしたさまざまなソフトが存在している。しかし、XMLの前身となったSGML(Standard Generalized Markup Language)の時代から続くもので、すでに時代遅れの感が否めない。

 特に、DTDは3つの点で重大な問題を抱えている。1つは、名前空間に対応する機能を持っていないこと。もう1つは、DTDは独自の構文を持っていて、XMLの要素や属性とは別の記述方法が必要である点である。もし、スキーマをXMLの要素や属性を用いて記述できれば、スキーマも一種のXML文書ということになり、XML文書を扱うさまざまなツールで処理できることになり便利なのである。しかし、DTDはそうではないということである。そして、もともとSGMLは文書処理を目的とした言語であったため、データ型の種類が極めて少なかった。整数という指定すらなかったのである(そのほか、ある名前の要素が内容モデルを1つしか持てないといった問題もあるが、ここではそこまで深く足を踏み入れない)。

 このような問題から、DTDの後継スキーマ言語として、いくつかの言語が生まれることになった。それらの言語を集約して、決定版として生まれたものがXML Schemaと呼ばれるスキーマ言語である。XML Schemaは、DTDの問題を解消した新しい世代のスキーマ言語である。名前空間にも対応しており、XML文書として記述する。そして、新しく強力なデータ型を指定する機構も生まれている。XML Schemaの仕様書は、XML Schemaの本体部分がPart1、データ型はPart2と分けられている。

 しかし、XML Schemaに対しては多くの批判が存在する。例えば、仕様が膨大で複雑すぎ、普通の技術者が仕様書を読めずに投げ出してしまうという意見は多い。また、ある種のスキーマが記述できないといった問題も起きている。XML Schemaを是としないXML関係者により、これとは別にRELAX NGというスキーマ言語も作られている。WWWの世界標準を生み出すWorld Wide Web Consortium(W3C)は本来XML Schemaを推進しなければならないのだが、この団体の内部にもXML Schemaに疑問の目を向ける人達がいる。実際に、最近のW3Cの技術文書の中には、スキーマをXML Schemaだけでなく、RELAX NGでも記述している例が増えている。その点で、必ずしもXML Schemaが絶対的な標準になるかどうか分からない。

 さて、それにも関わらず、今回はXML Schemaを取り上げる。筆者はRELAX NGの日本語訳の翻訳者の1人として名を連ねているので、本来ならRELAX NGを応援しなければならないのだが、今回はXML Schemaを使う。その理由は2つある。1つは、単純なスキーマを記述するだけなら、XML Schemaでもそれほど大きな問題に遭遇しないこと。おそらく、単純なスキーマだけを使っている場合、遭遇する可能性がある最も大きな問題は仕様が膨大すぎて読むのに挫折しかねないことぐらいだろう。

 もう1つの理由がこの問題を解消する。今回は、XML Schemaという言語を習得して記述するのではなく、Visual Studio .NETの機能を用いて、グラフィカルにスキーマを定義する。これにより、XML Schemaという言語に深く立ち入ることはしないので、仕様の迷宮をさまようことなく読み切ることができるだろう。むしろ、今回のような簡単なサンプルなら、驚くほど簡単にスキーマを扱うことができるとすらいえるのである。


 INDEX
  .NETで簡単XML
  第7回 VS.NETでXML Schemaを活用する(作成編)
  1.XML Schemaとは何か
    2.Visual Studio .NETでスキーマを作成する(1)
    3.Visual Studio .NETでスキーマを作成する(2)
    4.Visual Studio .NETでスキーマを作成する(3)
 
インデックス・ページヘ  「連載 :.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 記事ランキング

本日 月間