XMLの枠組みを使うと、新たなマークアップ言語を作り出すことができます。 ここでは、その設計法を概観してみましょう。
ここでもまた、既存のマークアップ言語であるHTMLを例に考えてみましょう。 HTMLはハイパーテキスト(Webページ)の文書構造を記述するために設計された言語です。 文書を構成する要素として、見出し、段落、箇条書きなどが用意されているほか、 ハイパーリンクを表すアンカー要素もありました。 これらは、HTMLの仕様を策定している人たちが決めたことです。
XMLの枠組みによって新たな言語を設計するとは、目的に応じて、 どのような要素を文書内に記述していくのか決めることです。
<個人データ> <郵便番号>〒120-8551</郵便番号> <住所>東京都足立区千住旭町5番</住所> <電話番号>03-5284-XXXX</電話番号> <氏名>電大 太郎</氏名> </個人データ>
この例では、「個人データ」という要素は、「郵便番号」「住所」「電話番号」「氏名」の4つの要素を子要素として持つように考えた、というわけです。
HTMLの仕様では、どんな要素があるかといったことだけではなく、 見出しやリンク(アンカー)は入れ子にしてはいけないなど、 細かなルールが定められています。 Webページとしてありえない記述がされてしまっては、 Webブラウザが困るからです。
XML文書も、1から自由に設計できるものの、 そのXML文書のやりとりやデータ処理を考えると、 厳格な仕様の取り決めが必要になってきます。 さきほどの住所録のデータにしても、 「電話番号」は省略してもいいのか、 「電子メール」という要素を追加してもいいのか、 すべて決めておかなければ、 データの記述形式としては使い物になりません。 曖昧な部分があっては、 そのデータを処理するアプリケーションを開発できないからです。
このような規則の集合のことをスキーマと呼びます。
XMLの文法に沿っているXML文書を整形式の文書と呼ぶのに対して、 さらに言語仕様に従っている(スキーマに適合している)XML文書を妥当なXML文書(valid XML document)と呼びます。
XML文書を入力データとして扱うアプリケーションの立場からすると、 入力されるデータの構造に問題はないかチェックすることが必要です。 入力されるXML文書のスキーマをあらかじめアプリケーションに与えておくことによって、 そのXML文書の妥当性を検証することができるようになります。
スキーマを記述するのにも、なんらかの記述言語が必要です。 スキーマを記述するための言語はスキーマ言語と呼ばれます。 よく知られているスキーマ言語には3種類あります。
DTDでは独自の文法で記述しますが、XML Schema と RELAX NG によるスキーマはXML文書となります。
DTD は広く使われていますが、仕様が策定されたのが XML の登場前であるため、 XML と組み合わせると記述力の不足が顕在化します。 これからスキーマを記述するのであれば、 XML Schema を使うのがよいでしょう。 ここでは、XML Schema で記述した簡単な例を示しますので、 雰囲気をつかんでください。
以前、以下のXML文書を例に挙げました。
<?xml version="1.0" encoding="utf-8"?> <挨拶状> <宛先> <名前>電大牛男</名前> <所属>東京電機大学</所属> </宛先> <本文> <段落>ようこそ!</段落> </本文> </挨拶状>
このスキーマを記述することを考えます。 以下のようなルールを記述できればいいわけです。
スキーマ言語XML Schema で記述すると、次のようになります。
<?xml version="1.0" encoding="utf-8"?> <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <xsd:element name="挨拶状" type="手紙タイプ"/> <xsd:complexType name="手紙タイプ"> <xsd:sequence> <xsd:element name="宛先" type="アドレスタイプ"/> <xsd:element name="本文" type="文章タイプ"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="アドレスタイプ"> <xsd:sequence> <xsd:element name="名前" type="xsd:string"/> <xsd:element name="所属" type="xsd:string"/> </xsd:sequence> </xsd:complexType> <xsd:complexType name="文章タイプ"> <xsd:sequence> <xsd:element name="段落" minOccurs="1" maxOccurs="unbounded" type="xsd:string"/> </xsd:sequence> </xsd:complexType> </xsd:schema>
XML文書ですから、先頭行には見慣れたXML宣言があります。 要素が xsd:element でそれぞれtypeを指定しています。 xsd:sequence は、この順序で子要素が出現すべきであることを表しています。 minOccurs や maxOccurs 属性で、出現回数を規定しています。