XML Schema: Schema(スキーマ)ってなに?

※できましたら先に DTD以降の項目、
   または 古典文学とXML(万葉集の構造を考えましょ) をご覧ください。

2005年07月31日(日)更新


■DTDからSchema(スキーマ)へ

たけち: 前にDTDについて勉強したよね。

さらら: うん。XMLドキュメントの構造を表わすのに使うんだったわね。「万葉集テキスト」のDTDを作る例を学んだおかげで少しはわかったと思うわ。

たけち: そうだね。でも、これからはDTDに代わってSchema(スキーマ)が使われることになるんだ。

さらら: えぇ〜!! 何それ〜。せっかく勉強したのに・・・

たけち: あっ、うぅ・・・・まっ、まあ聞いてよ、さらら。「万葉集テキスト」ぐらいだったら良いんだけど、データの取り扱いにXMLを使おうとするといくつか不都合なことがあるんだ。そこで、DTDのかわりになるものとしてSchema(スキーマ)が検討されてきたんだ。で、2001年5月2日にやっとW3Cの勧告になったんだ。

さらら

さらら: そうなの・・・スキーマか・・・私の心にもスキーマ風(すきま風)が吹きそうだわ・・・

さらら

たけち: そっ、そう言わずに・・・・・Schema(スキーマ)はDTDと同じでどのようにXMLでドキュメントやデータの構造・意味を表わすか、その書き方を決めたものだから、これまで学んだことは生きるんだからね。それに、ENTITYなんかはDTDの記法が生きているからね。

さらら: そっ、そうね。これまで学んだこととの違いを学べはいいのよね。どうしてDTDじゃだめで、SChema(スキーマ)だといいのかを教えて。

たけち: そうだね。じゃあ、まずそのお話から始めようね。

さらら: うん。


■DTDのまずい点とSchema(スキーマ)での改善

たけち: XMLの応用を広く考えると、DTDにはいくつかのまずい点があるんでSchemaで改善されたんだ。

Schemaで改善した主な点

データ型を指定できる
DTDでは、#PCDATAという任意の文字列を示す型なのでデータ処理には不向きでしたが、数値型や日付型などの指定ができるようにしました。
要素の出現回数を細かく指定できる
DTDでは、0回以上・1回以上・・・でしたが、Schemaでは、1〜2回とか0〜99回というように指定できます。
XMLテキストとして表現する
DTDは、特別な書式でしたがSchemaはXMLテキストとして表現します。
namespace(名前空間)が使える
DTDではnamespaceが使えません。Schemaでは複数のnamespaceの要素を利用できるようにしました。

さらら: あっ、なるほどって思えることもあるわね。XMLテキストとして表現できると読みやすくなるわよね。

たけち: それに、XMLだからXSLTでscehma(スキーマ)を変換したり、DOMを使ってscehma(スキーマ)にアクセスしたりできるよね。

さらら: そっか・・・・でも、それで何ができるかは今の私にはピンとこないけど。 (^ ^;

たけち: W3CでのSchemaの検討は1998年11月に始まって、2001年5月2日に以下のものとしてW3Cの勧告になったんだ。

さらら

W3C Schema勧告

XML Schema Part0
http://www.w3.org/TR/xmlschema-0/
XML Schemaを理解しやすいように豊富なサンプルで解説しています。
XML Schema Part1: Structures
http://www.w3.org/TR/xmlschema-1/
XMLテキストの構造・属性・内容の指定方法について規定しています。namespace(名前空間)の使い方も載っています。
XML Schema Part2: Datatypes
http://www.w3.org/TR/xmlschema-2/
XMLテキストの要素・属性のデータ型の指定方法について規定しています。

さらら: あらら・・・ずい分とたくさんありそうね。面倒くさくなぁい??

たけち: うっ、うん。やっぱり全部を見るのは大変だから、最低限知っておいたほうがいいものに絞って見てゆこうね。

さらら: うん。

たけち: まずは、こんな雰囲気になるというところを見ておくだけにしようね。つぎの図のような簡単な構造のときに、それぞれDTDとSchemaではどんな風に書くのかを載せておくね。

DTDとSchemaの簡単な例(上図のサンプル)
DTDSchema

<!DOCTYPE poems [

<!ELEMENT poems (poem)*>

<!ELEMENT poem (#PCDATA)>

<!ATTLIST poem pno ID #REQUIRED>

]>

<?xml version="1.0" encoding="Shift_JIS" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">

<xsd:element name="poems" type="PoemsType" />

<xsd:complexType name="PoemsType">
<xsd:sequence>
<xsd:element ref="poem" minOccurs="0" maxOccurs="unbounded" />
</xsd:sequence>
</xsd:complexType>

<xsd:element name="poem" type="PoemType" />

<xsd:complexType name="PoemType">
<xsd:simpleContent>
<xsd:extension base="xsd:string">
<xsd:attribute name="pno" type="xsd:ID" use="required" />
</xsd:extension>
</xsd:simpleContent>
</xsd:complexType>

</xsd:schema>

さらら: ふ〜ん。やっぱりずい分と違うのね。なんとなくはわかる感じだけど、細かいところでよく分からないことがあるわ。

たけち: うん。細かいことは次回から勉強していけばいいよね。

さらら: うん。

たけち: じゃあ、今回はこれでおしまい。

さらら: ありがと。

→ 次回はXMLスキーマの書き方-1 型です。 (^ ^)v

さらら


XMLスキーマのコーナーは、TAKABEさま(XSLTの遊び部屋)の全面的なご協力をいただいて作成しています。