いまさら言うまでもないことだと思うが、XMLはeXtensible Markup Language(拡張可能マークアップ言語)の略である。
この「拡張可能」がどういう意味かは、ちょっと前のエントリで書いているが、ここでも簡単に書いておこう。
XMLを応用した規格というのはたくさんある。XHTML、SVG、MathML、XAMLなどがそうだ。
こういった応用規格を、「XMLアプリケーション」と呼ぶ。Applicationとは、もともと「応用」という意味をもつ英単語だ。
余談だが、情報技術の教科書なんかだと、OSを「基本ソフトウェア」と呼んでいるものがある。その上で動くアプリケーション、すなわち「応用ソフトウェア」は、「基本ソフトウェア」の対義語になっている。
XMLアプリケーションは、要素や属性(以下、「要素」で統一する)と、その意味の対の集合である。たとえば、XHTMLなら「pは段落」「h1は第一レベルの見出し」「aは関連リソースへのリンクで、hrefはそのリソースの位置」というように、要素のそれぞれに意味がある。この対の集合がXHTMLというアプリケーションだ。
XMLが拡張可能である所以は、このアプリケーション、すなわち要素と意味の対を、自分で作ることができるという点にある。
さて、ここで、2つほど用語の定義をしておこう。
- スキーマ
- XMLの構文規則を定めたもの。
- 例えば、XHTMLの<dl>の中には、<dt>か<dd>が1つ以上なければならないと決まっている。
- XMLのスキーマを記述する方法は、XML Schema、RELAX NG、DTDなど、複数ある。
- スキーマ記述言語で書かれたスキーマ記述がなくとも、すべてのXML文書に何らかのスキーマはあるべきである(わかりにくいかもしれないが、スキーマとは「XMLアプリケーションの書き方の約束」のようなものである。明文化されているかいないかにかかわらず、スキーマがないということは、それは法則性を持たない無秩序なデータ記述であることになる。そのようなデータは再利用ができないので無価値である)。
- 名前空間
- スキーマに名前を付けたもの。
- すべてのスキーマに名前があるとは限らない。DTDは名前空間に対応していないし、XML Schemaでも、名前空間を特定しないスキーマを書くことはできる(RELAX NGはよく知らない)が、名前空間に対応したスキーマ言語を使っているなら、名前空間を指定することが推奨される。
- 一般にURIで表わされる。例えばXHTMLの名前空間はhttp://www.w3.org/1999/xhtmlだし、XML Schemaの名前空間(XML SchemaもXMLアプリケーションである)はhttp://www.w3.org/2001/XMLSchemaである。
- 要素名や属性名が同じであっても、名前空間が違えば、スキーマが違うのだから意味が違うということになる。
- 一般に、名前空間は対応するプリフィックス(XML Schemaならxsdなど)を用いて、xsd:stringのように記述される。これは{http://www.w3.org/2001/XMLSchema}stringの省略形である。このとき重要なのは、プリフィックスがxsdであることではない。プリフィックスは何でもよい。それをURIに展開した時に、{http://www.w3.org/2001/XMLSchema}stringになっていることが重要である。
- なお、この名前空間URIは、リンク先がインターネット上に存在する必要はない。名前空間を一意に識別できさえすればよい。
ちなみに、XMLアプリケーションと名前空間は1対1に対応しない。XHTMLなら大抵の場合は対応するが、RDFのように、複数の名前空間を混在させて使うことが前提のアプリケーションもある(Dublin Coreなどがよく使われる)。
ここでスキーマと名前空間について書いたのは、これらが、XMLの拡張性を飛躍的に向上させるからである。
XML文書は、1つのファイル中に、複数の名前空間を書くことができるからだ。
ブラウザなどのXMLを扱うソフトウェアがちゃんと解釈するかどうかはさておき、XHTML中にSVGやMathMLを混ぜて書くことで、Webページにベクタ画像や数式を掲載することができる。
ここで非常に重要なのは、XHTMLはもともと、それらが混ぜ込まれることを前提としていないということだ。
ちょっと話が飛ぶが、一般に「タグ付フォーマット」と呼ばれるファイルがある。
画像ファイルならTIFF、JPEG、PNGなどがそうだし、WaveやAVIもその一種だ。
こういったファイルは、内部に複数の「タグ」を持つ。なお、タグの呼び名はファイルによってまちまちである。TIFFはそのまま「タグ」(TIFFはTagged Image File Formatの略)だし、JPEGなら「セグメント」、PNGやWaveなら「チャンク」と呼ばれたりするが、意図するところは同じだ。
こういった「タグ」は、ファイル中のある一部分のデータが何を意味するかを定める。たとえば、デジカメで撮影したJPEGファイルで広く使われるEXIFなどがそれである。
ここまで言えばお分かりだと思うが、XMLの要素が「開始タグ」と「終了タグ」で囲まれることからもわかるように、XMLアプリケーションはタグ付フォーマットの一種である。
タグ付フォーマットでは、一般的に、ファイル中に、ソフトウェアが対応していないタグがあったら読み飛ばすことが多い。JPEGビューワはEXIF情報を理解しなくても画像を表示できる。
XMLの話に戻ろう。
XMLは、ひとつのファイル中に、複数の名前空間を混ぜて書くことができる。先程は、XHTMLにSVGやMathMLを混ぜる例を出した。
こういった混ぜ込み文書がある場合、Webブラウザは、XHTMLしか理解できないので、SVGやMathMLの部分は読み飛ばす。
WebブラウザにSVGやMathMLを表示するためのプラグインがインストールされていれば、そういったプラグインはXHTML部分を読み飛ばし、SVGやMathMLの部分だけを解釈して表示する。
他にも、フィードに対応したソフトウェアの場合、Webページ中に書かれたRSSを解釈したりする。
繰り返すが、XHTMLはSVGやMathMLやRSSを混ぜ込まれることを事前に想定していないし、SVGやMathMLやRSSも、XHTMLに混ぜ込まれるために作られた規格ではない。
このように、アプリケーションの設計時には想定していなかった名前空間を混ぜ込むことができる――これが、名前空間がXMLの拡張性を飛躍的に向上させるということだ。
XMLアプリケーションを処理するソフトウェアは、読み込むファイルに、どんな名前空間の要素が書かれているかを、あらかじめ限定してはならない。意味を知らない名前空間の記述があったら、単にそれを読み飛ばし、わかる部分だけを処理するようにしなければならない。
XML対応ソフトウェアを開発する際は、このことを肝に銘じて頂きたい。