この連載では、XML Schemaについて解説します。簡単なXMLの構造をXML Schemaにより記述できるようになることを目標に、XML Schemaの概要、要素・属性の定義、Complex TypeやSimple Type、属性グループについて解説していきます。連載を読むに当たり、整形式のXMLに関して十分理解していることを前提とします。
XML Schemaはスキーマ言語です。ところで、「スキーマ言語」とは何なのでしょう?そもそも「スキーマ」とは何なのでしょう? スキーマとは、XMLの構造です。「いつ、どの要素が出現するのか」「その要素にはどのような属性があるのか」など、XMLの木構造についての定義がスキーマです。そして、スキーマを記述する言語が「スキーマ言語」です。
例えば、インターネットショップなどでWebを通して商品を購入するとします。この場合、商品や顧客の情報をXML形式にして、商品を販売する企業のサーバに送信します。XML文書を受け取ったサーバ上のプログラムは、XMLを読み、XML文書内の商品データや顧客データを取得します。XML文書を読みデータを取得するプログラムをXMLパーサといいます。XMLパーサは取得したデータをサーバ上の受注プログラムなどに渡し、プログラムが受注処理を行います(図1)。
ここで商品購入者が好きなようにXML文書を作成し送信したのでは、サーバは受注処理を行うことができません。例えば、受注処理を行うには、「商品番号」「商品個数」や「顧客住所」など、必要なデータがあります。受注処理を円滑に行うためには、XMLパーサは受注プログラムにデータを渡す前に、必要なデータが発注XMLに含まれているか確認する必要があります。また、発注XMLを処理するのも、XMLパーサです。各データのフォーマットや出現の順番など、発注XMLが決まった形式で記述されていなければ、XMLパーサは発注XMLから商品データや顧客データを取得できません(図2)。
このように、XMLパーサがXML文書を適切に処理するには、「どのような構造のXML文書を送受信するのか」という取り決めを、XML送信者と受信者の間で交わす必要があります。そこで、スキーマです。XMLでデータ交換を行う場合、まずXMLの構造、つまりXMLの「スキーマ」を決めます。XMLを送信するコンピュータは、決められたスキーマに沿ったXMLを作成し、送信します。XMLを受信したXMLパーサは、受け取ったXMLがスキーマに沿ったものか確認した後、必要な処理を行います。双方が合意したスキーマに沿ったXMLを交換することにより、商品の発注・受注などの処理を円滑に行うことができます(図3)。
スキーマ言語は、XMLのスキーマを記述するための言語で、「XMLがどのような構造になっているのか」を説明するためのものです。XMLパーサは、スキーマ言語を知っていれば、そのスキーマ言語で記述された文書を読むだけで、これから解析しようとしているXML文書の構造が分かるわけです。
XMLのスキーマ言語として最もなじみ深いのはDTD(Document Type Definition)でしょう。DTDはXMLが誕生したときから存在するシンプルなスキーマ言語です。しかし、XMLの利用が急速に拡大し、その使用目的も多様化してきたため、DTDでは機能が不足してきています。そこで、DTDに代わるスキーマ言語として、XML Schemaが作成されました。
XML Schemaは次世代のスキーマ言語として、2001年にW3Cより勧告されました。XML Schemaは非常に強力なスキーマ言語で、「要素の内容には指定の文字列しか含まない」「この要素は最高5つまで指定可能」など、XMLの構造の細部まで指定できます。しかし、その半面仕様が膨大です。勧告当初は「XML Schemaを実装したXMLパーサは作成するのが困難」「使い物にならない」などといわれていました。しかし、2年たった現在、XML Schemaは確実に市場に受け入れられつつあります。
それでは、実際にXML Schemaを書いてみましょう。初めは、ルート要素として“greeting”が1つだけのXML文書をXML Schemaを使って書いてみましょう。
<greeting>Hello World!!</greeting>
XMLの構造は、以下のようになっています。
このXML文書のスキーマをXML Schemaで表すと、以下のようになります。
<?xml version="1.0"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="greeting" type="xsd:string"/> </xsd:schema>
まず、1行目はXML宣言です。
<?xml version="1.0"?>
XML SchemaはXMLの構造を表すための言語ですが、XML Schemaそれ自体もXML文書です。ですから、XMLの文法に沿って、要素や属性を記述していきます。最初にXML宣言を記述します。必要ならば、encoding属性を使用して文字コードの設定などを行います。
XML宣言の次は、ルート要素です。XML Schemaのルート要素は“schema”になります。
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
XML Schemaでは、schema要素の開始タグと終了タグの間に、XMLの構造がどうなっているのかを記述します。
ところで、要素名“schema”の頭に、“xsd:”という文字列が記述されています。これは、どういう意味なのでしょうか。
XMLでは、要素や属性などを自由に作成することができます。そのため、もしかしたらschemaという名前の要素が、どこかでまったく別の用途に使用されているかもしれません。そこで、「ここでのschemaという要素は、XML Schemaで定義されたものである」ということを、明確に指示する必要があります。そのために、XMLには「名前空間」と呼ばれる仕組みが用意されています。
もう一度、2行目を見てみましょう。
この例では、「xmlns:xsd="http://www.w3.org/2001/XMLSchema"」の部分で、「要素名の先頭にxsd:と付いたら、http://www.w3.org/2001/XMLSchemaで定義された要素である」と宣言しています。これを「名前空間宣言」といいます。“http://www.w3.org/2001/XMLSchema”はXML Schemaを表す識別子(名前空間URI)です。そして、“xsd”を使って“xsd:schema”と書くと、「XML Schemaのschema要素」という意味になります。この例の“xsd”のことを、「名前空間接頭辞」といいます。“xmlns:”で始まる名前空間宣言で定義された名前空間接頭辞は、その要素自身と、その子要素で使用することができます。
さて、3行目でようやくXMLの構造について表現します。対象とするXMLは、greeting要素が1つだけからなる文書でした。要素は“element”要素を使用して宣言します。
まず、「xsd:element」の部分です。element要素もXML Schemaの要素ですから、“xsd:”という接頭辞を付けて記述します。宣言する要素の名前は、name属性で指定します。ルート要素の名前は“greeting”ですので、name属性の値に“greeting”と指定します。要素の内容がどのような構造になっているかは、type属性で指定します。greeting要素は子供要素も属性も持ちません。また、内容には文字列が含まれます。このような場合、type属性の値には「子供要素・属性なし/内容は文字列」を表す「xsd:string」を指定しましょう。
気付きましたか? 属性値“xsd:string”にも、名前空間接頭辞“xsd:”が付いています。これは、「greeting要素は、XML Schemaで定義しているstring型である」ことを示しています。そのため、名前空間接頭辞“xsd:”を属性値の“string”の前にも記述します。XML Schemaには“string”のほかにもいろいろな「型」が用意されていて、type属性の値として指定可能です。「型」については、後の連載記事で順に説明します。
最後に、schema要素の終了タグを記述しましょう。
</xsd:schema>
これで、スキーマが完成しました。
今回は要素が1つだけの簡単なXMLでした。次回は、複数の要素からなるXML文書の構造をXML Schemaで表すにはどうしたらよいか、説明します。(次回に続く)
Copyright © ITmedia, Inc. All Rights Reserved.