XMLによる
言語の設計

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

言語を設計する必要性

言語を作るとは

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

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

<個人データ>
  <郵便番号>〒101-8457</郵便番号>
  <住所>東京都千代田区神田錦町2-2</住所>
  <電話番号>03-5280-XXXX</電話番号>
  <氏名>電大 太郎</氏名>
</個人データ>

この例では、「個人データ」という要素は、「郵便番号」「住所」「電話番号」「氏名」の4つの要素を子要素として持つように考えた、というわけです。

言語を設計する意義

HTMLの仕様では、どんな要素があるかといったことだけではなく、 見出しやアンカーは入れ子にしてはいけないなど、 細かなルールが定められています。 HTMLでハイパーテキストを逸脱する記述ができてしまっては、 Webブラウザが困るからです。

XML文書も、1から自由に設計できるものの、 そのXML文書のやりとりやデータ処理を考えると、 厳格な仕様の取り決めが必要になってきます。 さきほどの住所録のデータにしても、 「電話番号」は省略してもいいのか、 「電子メール」という要素を追加してもいいのか、 すべて決めておかなければ、 データの記述形式としては使い物になりません。 曖昧な部分があっては、 そのデータを処理するアプリケーションを開発できないからです。

このような規則の集合をスキーマと呼びます。

整形式の文書と妥当な文書

XMLの文法に沿っているXML文書を整形式の文書と呼ぶのに対して、さらに言語仕様に従っている(スキーマに適合している)XML文書を妥当なXML文書(valid XML document)と呼びます。

XML文書を入力データとして扱うアプリケーションの立場からすると、 入力されるデータの構造に問題はないかチェックすることが必要です。 入力されるXML文書のスキーマをあらかじめアプリケーションに与えておくことによって、そのXML文書の妥当性を検証することができるようになります。

スキーマの記述方法

スキーマを記述するのにも、なんらかの記述言語が必要です。 スキーマを記述するための言語はスキーマ言語と呼ばれ、 現在使われている主なスキーマ言語は3種類あります。

DTDでは独自の文法で記述しますが、XML Schema と RELAX NG によるスキーマはXML文書となります。

スキーマ記述の例

DTDは仕様書でも使われていて古典としての価値がありますが、 これからは XML Schema や RELAX NG の時代です。 ここでは、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で記述されていることがわかります。