前回までDTDについて学習しましたが,代表的なスキーマ定義言語のひとつにXML Schemaがあります。XML SchemaはW3Cより勧告された仕様で,DTDよりも厳密なルールを定義することができます。今回はXML Schemaを使って,はてなダイアリー形式XML文書の構造を定義してみましょう。また,その構造定義を通してXML Schemaの基本構文を学習します。

図1●はてなダイアリー形式XML文書の構造

 図1の構造をXML Schemaで定義すると,次のようになります。

例1 図1の構造のXML Schemaの定義例
※行番号は解説の便宜上付けたもので,実際のコードには必要ありません

[画像のクリックで拡大表示]

 例1のXML Schemaの定義例は,第6回のDTDを使った定義例と内容は同じです。まずは,DTDとXML Schemaの主な違いを見てみましょう。

◇XML SchemaはXML文書

 XML SchemaはXSLTスタイルシートと同様,XMLの文法を用いて記述し,整形式XML文書にしなければなりません。一方,DTDはXMLの文法に準拠しない独自の文法で記述します。

◇XML Schemaは多様なデータ型に対応

 DTDでは,要素も属性も文字データしか定義することができません。これに対してXML Schemaでは,任意の文字列を定義するstringや32ビットで表せる整数int,64ビットで表せる整数longなど,一般的なプログラミング言語などで使われているデータ型を使用することができます。

 stringやint,longなどのデータ型は「組み込み単純型」と呼び,XML Schema仕様の「Part2:Datatypes仕様」で定義されています。XML Schema仕様のPart2:Datatypes仕様で定義されている主なデータ型を表1にまとめましたので,参照してください。また,要素の内容として,子要素を持つ場合や要素が属性を持つ場合などは,用途に合わせてデータ型を作ることもできます。このことを「独自の型」と呼び,「単純型」と「複合型」の2種類があります。「独自の単純型」は,組み込み単純型のデータ型に対して制約を付与するような場合に使用します。「独自の複合型」は,要素の内容として子要素を持つ場合や要素が属性を持つ場合に使用します(図2)。

図2●XML Schemaのデータ型
表1●主な組み込みデータ型
※XML Schemaの名前空間接頭辞をxsとする
データ型名 説明
xs:string 任意の文字列
xs:int 32ビットで表せる整数
xs:unsignedInt 32ビットで表せる符号なし整数
xs:long 64ビットで表せる整数
xs:unsignedLong 64ビットで表せる符号なし整数
xs:float 単精度浮動小数点数(32ビット)
xs:double 倍精度浮動小数点数(64ビット)
xs:datetime 日付と時刻
xs:date 日付
xs:time 時刻
xs:ID XML1.0仕様のID型
xs:IDREF XML1.0仕様のIDREF型

確認問題1
次のDTDとXML Schemaの違いについて,正しいものを選択してください。

(a)
XML SchemaはXML1.0の文法を使用して記述する
(b)
DTDはXML1.0の文法を使用して記述する
(c)
XML Schemaのデータ型は文字データのみ定義できる
(d)
DTDのデータ型は文字データのみ定義できる

 正解は(a),(d)です。(a)はXML Schemaについての正しい説明です。(b)は誤り。DTDは独自の文法を使用して記述します。(c)も誤りです。XML SchemaではPart2:Datatypes仕様で定義されている組み込み単純型を使用することができ,さらに用途に合わせて,単純型や複合型のデータ型を作ることもできます。(d)はDTDについての正しい説明です。

 それでは,例1を基にXML Schemaの各要素を見ていきましょう。

◇xs:schema要素

<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
・・・
</xs:schema>

 xs:schema要素(例1の3行目)は,XML Schemaの最上位要素(ルート要素)となります。すべてのXML Schemaの要素は「http://www.w3.org/2001/XMLSchema」という名前空間に属さなければなりません。以前はXML Schemaの名前空間接頭辞を「xsd」としていましたが,最近では「xs」がよく使われており,この連載の中でも「xs」を使用することとします(名前空間,名前空間接頭辞については,別の回で詳しく説明します)。

◇xs:element要素

  <xs:element name="body" type="xs:string" />

  <xs:element name="diary" type="diaryType" />

 xs:element要素(例1の21行目,5行目)を使用して,要素を定義します。xs:element要素のname属性に要素名を指定し,type属性にデータ型を指定します。データ型には,stringやintなどの組み込み単純型はもちろん,独自の型(この例では,diaryType型)を指定することもできます。また,default属性でデフォルト値,fixed属性で固定値を指定することもできます。ただし,default属性とfixed属性は同時に指定することはできません。

  <xs:element ref="day" minOccurs="1" maxOccurs="unbounded" />

 例1の8行目のxs:element要素は,他の要素の宣言を参照しています。ref属性で参照元となる要素名を指定し,minOccues属性で出現回数の下限値を,maxOccurs属性で出現回数の上限値を指定し,無制限に出現する場合には,「unbounded」を指定します。出現回数を細かく指定できることもDTDと異なる点として挙げることができます。宣言した要素が1回だけ出現する場合には,minOccurs属性,maxOccurs属性を省略することができます(minOccurs属性,maxOccurs属性のデフォルト値は 1 )。なお,minOccurs属性,maxOccurs属性には,0以上の任意の整数を指定できます。

確認問題2
次の要素の宣言の中で誤っているものを選択してください。なお,XML Schemaの名前空間接頭辞は「xs」とします。

(a)
<xs:element name="day" type="xs:string" />

(b)
<xs:element name="day" type="xs:string" default="20061201" />

(c)
<xs:element name="day" type="xs:string" fixed="20061201" />

(d)

 正解は(d)です。(d)はdefault属性とfixed属性が同時に記述されています。XML Schemaの要素宣言では,xs:element要素のdefault属性とfixed属性は同時に記述することはできず,default属性またはfixed属性のいずれかひとつを記述します。

野中 康弘
インフォテリア 教育部 エンジニア。十数年間システム開発に携わり,そのうちの半分をデータベース管理者として奮闘する。現在は,インフォテリア認定教育センターのサポートや,XML技術者認定制度の「XMLマスター」に対応したコーステキストの開発などを担当している。