XMLによる
言語の設計

XMLの枠組みを使うと、新たなマークアップ言語を作り出すことができます。 ここでは、その設計法を概観してみましょう。

言語を設計する必要性

言語を作るとは

ここでもまた、既存のマークアップ言語であるHTMLを例に考えてみましょう。 HTMLはハイパーテキスト(Webページ)の文書構造を記述するために設計された言語です。 文書を構成する要素として、見出し、段落、箇条書きなどが用意されているほか、 ハイパーリンクを表すアンカー要素もありました。 これらは、HTMLの仕様を策定している人たちが決めたことです。

XMLの枠組みによって新たな言語を設計するとは、目的に応じて、 どのような要素を文書内に記述していくのか決めることです。

<個人データ>
  <郵便番号>〒101-8457</郵便番号>
  <住所>東京都千代田区神田錦町2-2</住所>
  <電話番号>03-5280-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 と RELAX NG の簡単な例を示しますので、 雰囲気をつかんでください。

以前、以下のXML文書を例に挙げました。

<?xml version="1.0" encoding="utf-8"?>
<挨拶状>
   <宛先>
      <名前>電大牛男</名前>
      <所属>東京電機大学</所属>
   </宛先>
   <本文>
      <段落>ようこそ!</段落>
   </本文>
</挨拶状>

このスキーマを記述することを考えます。 以下のようなルールを記述できればいいわけです。

XML Schema の場合

スキーマ言語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 属性で、出現回数を規定しています。

RELAX NGの場合

スキーマ言語RELAX NGで記述すると、次のようになります。

<?xml version="1.0" encoding="utf-8"?>
<element name="挨拶状" xmlns="http://relaxng.org/ns/structure/0.9">
   <element name="宛先">
      <element name="名前">
         <text/>
      </element>
      <element name="所属">
         <text/>
      </element>
   </element>
   <element name="本文">
      <oneOrMore>
         <element name="段落">
            <text/>
         </element>
      </oneOrMore>
   </element>
</element>

XML文書ですから、先頭行には見慣れたXML宣言があります。 あとは非常に直感的で、XML要素がelement、要素の内容がtext、 1回以上という条件がoneOrMoreで記述されていることがわかります。