Extensible Markup Language
Extensible Markup Language
Extensible Markup Languageは、基本的な構文規則を共通とすることで、任意の用途向けの言語に拡張することを容易としたことが特徴のマークアップ言語の総称である。一般的にXML(エックスエムエル)と略称で呼ばれる。JISによる訳語は「拡張可能なマーク付け言語」と定義している。XML文書のフォーマットを予め統一することで、異種プラットフォーム間での情報交換も可能となる。
SGMLからの移行を目的として開発された。文法はSGMLの構文解析器と互換性を保つようにSGMLのサブセットに定められシンプルになり、機能はSGMLに無いものが追加されている。
XML の仕様は、World Wide Web Consortium (W3C) により策定・勧告されている。1998年2月に XML 1.0 が勧告された。2010年4月現在、XML 1.0 と XML 1.1 の2つのバージョンが勧告されている(#バージョン)。
ちなみに、「eXtensible Markup Language の略である」と書かれることがあるが、これは間違いであり、XはExの発音を表している。
XMLは、個別の目的に応じたマークアップ言語群を創るために汎用的に使える。マークアップ言語とは、コンピュータ言語の一種で(広義の「コンピュータ言語」であり、プログラミング言語ではないデータ記述言語などを含む意味)あるが、詳細は「マークアップ言語」の記事を参照のこと。XMLは、その「入子状にタグで囲まれたもの」という構文を共通としたことで、拡張が容易であるとして「extensible」と主張している。
上記の理由もあって、しばしば「あらゆる目的に使える」などと主張されるが、データ構造的には木であって、より入り組んだネットワーク構造(グラフ構造)を直接扱うことは不可能である(XLinkなどの提案はあるが)。
XMLの最も重要な目的は、異なる情報システムの間で、特にインターネットを介して、構造化された文書や構造化されたデータの共有を、容易にすることである。XMLを使うと、文書を構造化して記述できるし、コンピュータのデータを直列化 (シリアライズ) できる。データを直列化する用途でXMLを使う際には、XMLは、JavaScript Object Notation (JSON) やYAMLなどの、テキストを基にした他の直列化言語と比較衡量できる。
XMLは、ユーザが定義したタグを用いて文章構造を記述するマークアップ言語である。HTMLが、Webページを記述するための言語であるのに対して、XMLは、データ交換のための汎用のデータ形式である。HTMLで使用するタグはあらかじめ定義済みのものだが、XMLではユーザが新しくタグを定義して、データの意味や構造を記述することが可能である。
XMLで文書の論理的構造を規定する制約を追加することによって、XMLを適用したマークアップ言語を実装できる。XMLを適用したマークアップ言語は非常に多く存在している (#XMLの応用の節を参照)。例えば、Extensible HyperText Markup Language (XHTML)、DocBook、RSS、Mathematical Markup Language (MathML)、ebXML、Scalable Vector Graphics (SVG)、MusicXML などがある。さらにXMLは、そういった個別のXMLについての構文規則を示すためのスキーマ言語も用意している。スキーマ自体もXMLのXML Schemaの他、XMLではない記法でとても簡潔に大変わかりやすく書ける、Compact Syntaxも用意されているRELAX NGもある。
XMLは、同じく汎用的に使えるマークアップ言語である Standard Generalized Markup Language (SGML) の、簡素化されたサブセットとして、人間にとっても比較的判読しやすいように設計された (#歴史を参照)。XMLの仕様は、XMLワーキンググループなどにより設計が行われ、World Wide Web Consortium (W3C) により勧告 (策定) されている。XMLは無償で使えるオープン標準の技術である。XML仕様のW3C勧告ではXMLの文法とXMLプロセサ (XMLパーサ、XML文書の構文解析器) のための要件を定めている。1998年2月に XML 1.0 が勧告され、2004年2月に XML 1.1 が勧告された(#バージョン参照)。
XML文書の正当性の水準には、整形式XML文書と妥当なXML文書の、2つの水準がある (#整形式XML文書と妥当なXML文書を参照)。XML文書のマークアップ規則に従って記述されていることだけが問題とされる文脈で、スキーマ言語を使わずに、XML文書のマークアップ規則に従って記述された文書を、「整形式XML文書」 (well-formed XML document) という (#XMLの構文と整形式XML文書を参照)。さらに、XML文書をより厳密に構造化した文書やデータとして扱いたい場合は、XML文書の構造をスキーマ言語によって定義することができ、XMLプロセサでそのXML文書(XMLインスタンス)に対してその文書構造に従っていることを検証する(妥当性検証を行う)というように、XML技術を使うこともできる (#XML文書の論理的構造と妥当なXML文書を参照)。
XML文書に対して妥当性検証を行うことにより、従来アプリケーションソフトウェアで行ってきた、XML文書の構造の検査や、XML文書に含まれるデータに対するデータ型のチェックや値の範囲のチェックが、可能となる。スキーマ言語としては Document Type Definition (DTD、文書型定義)、W3C XML Schema、RELAX NG (文書スキーマ定義言語: DSDL)などがある。XML文書の構造がスキーマ言語によって定義され、XML文書の妥当性を検証するソフトウェアによって妥当性が検証されたXML文書のことを「妥当なXML文書」 (valid XML document) という。整形式XML文書は、妥当なXML文書である場合と、妥当なXML文書ではない場合とがある。スキーマ言語を採用して妥当性検証を行う方法でXMLを使うこともできるし、スキーマ言語を採用せず妥当性検証を行わないで手軽にXMLを使うこともできる。
XML勧告では、XMLプロセサがサポートすべき文字符号化方式(文字コード)としてUTF-8とUTF-16 (Unicode) を定めているため、英語以外の言語も扱いやすくなっている (#多言語環境で使うを参照)。また、UTF-8とUTF-16以外の文字コード(UCS-4、EUC-JP、Shift_JIS、EBCDICなど)を用いることも可能である。
XMLだけでは最低限の書式しか決められていないため、XMLの力を引き出す各種の関連技術が別途標準化されている (#XMLの拡張および#XML文書をプログラムで処理する、#XML文書を視覚的に表示する、#XML情報集合を参照)。
以下に挙げるものをはじめとして、現在も多くの関連技術の標準化作業が行われている。
プログラムからXML文書を処理する方法として、Document Object Model (DOM) や Simple API for XML (SAX) などのアプリケーションプログラミングインタフェース (API) が標準化されている。
XML文書のスタイルを指定する技術(スタイルシート)として Extensible Stylesheet Language (XSL) や Cascading Style Sheets (CSS) などがある。
XML文書を非テキスト形式(バイナリ)で効率的に表現する方法として、World Wide Web Consortium (W3C) は Efficient XML Interchange (EXI) フォーマットを定義した。
XMLは現在、広く普及している技術であるが、その技術的な有用性などについて、肯定的に評価する人々が多い一方で、批判的に評価する人々も多い (#XMLに対する支持と批判を参照)。
XML文書の正当性の水準には、整形式XML文書と妥当なXML文書の、2つの水準がある。なおXML文書に対して、整形式XML文書としての検査のみを行うXMLプロセサを非検証XMLプロセサといい、整形式XML文書としての検査に加えて妥当なXML文書としての検査を行うXMLプロセサを検証XMLプロセサという。
整形式XML文書 (well-formed XML document) は、XMLの構文の規則のすべてに準拠している。例えば、文書中のある要素が開始タグが有るが対応する終了タグが欠落している場合、その文書は整形式 (well-formed) ではない。整形式ではない文書はXML文書とはみなされない。非検証XMLプロセサおよび検証XMLプロセサは、整形式ではない文書を処理することはできない (処理を試みるとエラーになる)。
妥当なXML文書 (valid XML document) は、整形式XML文書としての条件を満たしていることに加えて、文書の論理的構造を規定する何らかの規則に準拠している。このような規則は、RELAX NG や XML Schema、Document Type Definition (DTD、文書型定義) などのスキーマ言語で定義されたスキーマで定める。例えば、あるXML文書がスキーマに定義されていない要素 (タグ) を含んでいた場合、検証XMLプロセサは、そのXML文書を処理することはできない。検証XMLプロセサによって検証されたXML文書は、妥当 (valid) であると位置づけられる。なお、妥当な文書であっても、非検証XMLプロセサでは実体の定義を確認しないため、仕様で定められている実体参照(&lt;、&gt;など)以外の私的な実体参照を用いている場合、非検証XMLプロセサは当該実体を参照できず致命的なエラーとなる。
整形式XML文書が満たすべき構文の規則を説明する。
整形式XML文書としての条件が満たされることのみを考慮する場合 (スキーマ言語を使わずに手軽にXMLを使う場合) においても、XMLは、大量の文書やもしくは木構造として表現することができるデータを格納するための、一般的な枠組みとしての役割を果たすことができる。
XML文書は、要素 (element) と属性 (attribute) が複数集まって、構成されている。
要素は内部に子要素を含むことができる。属性は要素に付随し、属性の内部に子要素を含むことはできない。要素は開始タグと終了タグで内容を挟むことで表現する。
開始タグは「<要素名>」、終了タグは「</要素名>」で記述する。
一つの要素を記述するための基本的な構文を次に示す。
ここで、<要素名> をこの要素の開始タグといい、</要素名> を終了タグという。「内容」は何らかのテキストである。
次に示す例は整形式XML文書である。
この例は、書籍という要素を一つもつXML文書である。<書籍> が書籍要素の開始タグであり、</書籍> が書籍要素の終了タグである。「出版日="2007-10-31"」は書籍要素の属性である。この属性の名前 (属性名) は「出版日」であり、この属性の値 (属性値) は "2007-10-31" である。「これは書籍です.... 」は、書籍要素の内容である。
要素の内容を構成するテキストはまた、さらに任意の数の要素を含むことができる (なお、このように一つの要素内に文字列データと子要素が混在するものを、「混合内容」と呼ぶ)。
すなわち、一般的なXML文書は木構造をなす。
この点において、XMLはプログラミング言語LISPのS式と似ている。
S式でも木構造を記述する。S式の木構造のおのおのの節は、自分自身のプロパティリストをもつことができる。
要素は内部に別の要素を含むことができる。構造化したXML文書の例を示す。
要素の属性の値は、必ずシングルクォート (') かダブルクォート (") で括らなければならない。そして要素内にある属性は、互いに属性名が異なっていなければならない。XML文書では要素は正しく入れ子になっていなければならない。要素は決してオーバーラップしていてはならない。
例えば、次の文書は整形式XML文書ではない。なぜなら 書名 要素と 著者 要素がオーバーラップしているからである。
次の2つの文書は整形式XML文書である。
整形式XML文書においては、XML文書は正確に一つのルート要素 (文書要素; document element とも呼ばれる) をもたなければならない。ルート要素とは、XML文書の要素の階層構造において最上位の要素のことをいう。最上位の要素は一つでなければならない。最上位の要素が複数ある文書は、整形式XML文書ではない。
整形式XML文書が一つのルート要素をもたなければならないという条件が意味することは、整形式XML文書のテキストは、ルート要素の開始タグと対応する終了タグの間に、収められなければならないということである。ルート要素の開始タグと終了タグの間に収められたテキストは、任意の数の要素や文字列データを含むことができる。
ルート要素の前に、必要に応じて、XML宣言 (XML declaration) をおくことができる。このXML宣言は、XMLのどのバージョンが使われているか (現時点ではバージョン1.0であることが多い) などを示す。XML宣言では、XMLのバージョンの他に、文字符号化方式 (文字コード) の指定や、他のXML文書との依存関係についての指定を、行うこともできる。
XML文書の文字符号化方式がUTF-8かUTF-16の場合は、XML宣言をおいてもよいし、XML宣言をおかなくてもよい。
XML文書の文字符号化方式がUTF-8でもUTF-16でもない場合は、XML宣言をおいて文字符号化方式を明示する必要がある。
XML宣言を含んだXML文書の例を示す。
XML仕様では、XMLプロセサ (XMLパーサ、XML文書の構文解析器) が、Unicodeの文字符号化方式であるUTF-8およびUTF-16で記述されたXML文書を処理できることを、必須条件としている (UCS-4は必須条件ではない)。XMLプロセサは、UTF-8およびUTF-16の他にも、いくつかの任意の文字符号化方式の文書を処理できるようにして良い。例えば、UCS-4、EUC-JP、Shift_JIS、EBCDICなどの文字符号化方式の文書を処理できるXMLプロセサが、広く普及し、使われている。
コメントはXML文書の木構造のどこにでもおくことができる。
コメントは、"<!--" で始まり、"-->" で終わる。
なお、コメント内に "--" を含むことはできない。
コメントを含むXML文書の例を示す。
内容のない要素を空要素 (empty element) という。XMLでは、空要素を表現するために特別な構文を使うことができる。開始タグを書きその直後に終了タグを書くこともできるが、その代わりに空要素のタグを使うことができるのである。空要素タグは開始タグと似ているが、閉じ括弧の直前にスラッシュをおく。
次の3つの例は、XMLでは同等である。
空要素タグは属性を含むことができる。
XML文書ではどのUnicodeの文字も (XMLで特別な意味をもつ、開き山括弧 "<" のような文字を除いて)、要素名として、属性名として、コメント内容として、文字データとして、処理命令 (後述) として、直接に使うことができる。このため、漢字とキリル文字を共に含む次の文書も、整形式XML文書である。
XML文書 (あるいはSGML文書、HTMLウェブページを含む) において、文書型宣言 (DOCTYPE宣言、Document Type Declaration) は、その文書を特定の Document Type Definition(DTD、文書型定義) のスキーマと関連づけることを記述するものである。なお、Document Type Definition (DTD、文書型定義)は、XMLで使うことができるスキーマ言語の一つである。文書型宣言は、その文書が特定のスキーマに準拠していることを宣言する。
XML文書では文書型宣言を記述してもよいし、記述しなくてもよい。DTDをスキーマ言語として妥当性検証を行うことを想定しているのであれば、文書型宣言の記述は必須となるであろう。DTDで妥当性検証を行わない場合でも、後述する実体参照などを文書中で使うのであれば、文書型宣言において文書中で使う実体を宣言することができる。
文書型宣言は、その文書が特定のスキーマに準拠していること (妥当なXML文書であること) を、保証しているわけではない。文書型宣言に記されたスキーマに準拠しているかどうかを判断するには、検証XMLプロセサでその文書を検証する必要がある。
文書型宣言の一般的な構文は次のとおりである。
<!DOCTYPE ルート要素名 [SYSTEM もしくは PUBLIC 公開識別子] 外部サブセット参照 [
]>
ここで外部サブセットとは、そのXML文書のDTDを構成する (要素の型の宣言、後述する実体の宣言などの) 宣言群のうち、別ファイルに記述された宣言群のことである。また内部サブセットとは、そのXML文書のDTDを構成する宣言群のうち、文書型宣言内に直接記述された宣言群のことである。
XHTML 1.0 Strict に準拠したXML文書での文書型宣言は、次のとおりである。
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
XML文書においては、ルート要素がその文書の最初の要素である (例えば、XHTMLではルート要素は html である)。SYSTEM キーワードと PUBLIC キーワードは、その文書型 (文書の構造) の種類を指定する。一般に広く知られていないDTDを使う場合は、SYSTEM キーワードを使う。一般に広く知られているDTDを使う場合 (XHTMLなど) は、PUBLIC キーワードを使う。
SYSTEM キーワードを使う際は、その後に続けて、その文書が準拠するDTDのファイルのURIを、外部サブセット参照として記述する。
PUBLIC キーワードを使う際は、その後に続けて、その文書が準拠するDTDの公開識別子 (public identifier) を指定しなければならない (例えば XHTML 1.0 の公開識別子は、"-//W3C//DTD XHTML 1.0 Strict//EN" である)。公開識別子を記述した後に続けて、SYSTEM キーワードを使う場合と同様に、その文書が準拠するDTDのファイルのURIを、外部サブセット参照として記述する。
内部サブセットは必要に応じて記述する。
内部サブセットとして、DTDの一部分もしくはDTDの全体を記述することができる。
なお、内部サブセットとしてDTDの全体を記述する場合は、SYSTEMキーワード・PUBLICキーワード・外部サブセット参照は、いずれも記述しない。
実体参照 (entity reference) は、実体を表現するプレースホルダである。
XMLにおける実体 (entity) とは、SGMLにおける実体と同じように、名前の付けられたデータの本体である。具体的には、ファイルもしくは置換文字列のように、何らかの形でXML文書の一部となるデータを格納しているもののことである。置換文字列を使う事例としては、次のような場合がある。
キーボードから簡単には入力できない文字をXML文書中に表現したい場合。
決まった単語の並びがXML文書中に何度も出現する場合。
実体参照の構成は、まず最初にアンパサンド ("&") があり、その後に実体の名前が続き、セミコロン (";") で終わる。
XMLには、事前宣言された実体として次の表に示す5つの実体がある。
「AT&T」の名前でアンパサンドを表現するために、事前宣言されたXMLの実体を使う例を示す。
事前宣言された実体以外の実体を宣言する必要がある場合、XML文書の Document Type Definition (DTD、文書型定義) の内部で宣言する。
XML文書の内部に定義されたDTDを使って、置換文字列としての実体を宣言して、実体参照を使う例を次に示す。宣言された実体は、一つの文字であっても良いし、テキストの断片であっても良いし、他の実体への参照を含むテキストであっても良い。
XMLに準拠したブラウザを使うと、先のXML文書は次のように表示される。
Copyright © 2007 平成新報社
ファイルの実体を参照するXML文書の例を示す。
なお、別ファイル another-file.xml には次の内容が記されていることとする。
XMLに準拠したブラウザでこのXML文書を表示すると、次のようになる。
星新一はSF作家である。小松左京はSF作家である。筒井康隆はSF作家である。
文字参照 (character reference) は、文字をXML文書内でコード番号を指定して記述する記法である。文字参照は、実体参照と似ているが、実体参照では名前を使うのに対し、文字参照ではその部分で始めに "#" 文字を記述し続けて数字を記述する。
文字参照で使う数字は、符号化文字集合の国際規格である ISO/IEC 10646 (およびUnicode) のコード番号である。文字参照で使うことができる数字は、十進数であるか "x" を前につけた十六進数である。文字参照は、実体参照とは異なり、事前宣言されているわけでもなく、XML文書のDTD内部で宣言されているわけでもない。文字参照は、簡単には符号化できない文字を表現するために使われることが多い。例えば、欧州のコンピュータ上で作成するXML文書でアラビア語の文字を使う場合などである。「AT&T」の例の内のアンパサンドは、この場合に似ているともいえる。十進数の38と十六進数の26は、共に ISO/IEC 10646 の "&" 文字のコード番号である。つまり「AT&T」はXML文書では次のように記述することができる。
処理命令 (processing instruction) は、XML文書の構成要素であり、XML文書を扱うソフトウェアに対する何らかの処理を行う命令を、記述する内容が、処理命令である。
次に処理命令の構文を示す。
処理命令は ?> の文字列を除き任意の処理内容を記述することができる。処理命令には、処理内容として擬似属性 (pseudo attribute) を記述することがある。擬似属性は、記述のしかたが属性名と属性値のペアに似ている。しかしXMLプロセサは擬似属性を、属性として解釈せず、処理命令の処理内容として解釈する。
擬似属性を使った処理命令の例を次に示す。
これはXML文書にカスケーディングスタイルシート (CSS) と関連づけるという処理命令である。
あるXML文書内に記述された特定の処理命令について、その処理命令をプログラマーが意図したとおりの処理を実行させるためには、そのXML文書を処理するアプリケーションソフトウェア側がその処理命令に対応する必要がある。
XML文書 (およびSGML文書) においてCDATAセクションとは、文字列データのみで構成されておりマークアップされたデータは含まれていないと、XMLプロセサが解釈するようマークされた、要素の内容を構成する文字列データの一部である。CDATAセクションは、文字列データを表現するための単なる代替構文である。
CDATAセクションとして宣言された文字列データと、"<" と "&" を "&lt;" と "&amp;" で表現する通常の構文で記述した文字列データとの間に、意味的な違いはない。
CDATAセクションは次の記述で始まる。
<![CDATA[
そしてCDATAセクションの内容が続き、次の記述が最初に出現したところでCDATAセクションは終わる。
]>
CDATAセクションの内容の文字列は全て文字列データとして解釈され、マークアップや実体参照や文字参照として解釈されることはない。
次の例で「送信者」の開始タグと終了タグはマークアップとして解釈される。
<送信者>星新一</送信者>
しかし次のように記述した場合は、
<![CDATA[<送信者>星新一</送信者>]>
次のように記述したものと同等に解釈される。
&lt;送信者&gt;星新一&lt;/送信者&gt;
すなわち、「送信者」タグは「星新一」の文字列と同列に位置づけられ、いずれも文字列データとして解釈される。
文字参照 &#x00F0; が要素の内容で出現した場合は、一つのUnicode文字 00F0 ("ð") として解釈される。しかしCDATAセクション内で出現した場合は、8つの文字からなる文字列として解釈される。
すなわち、アンパサンド、#マーク、文字x、数字0、数字0、文字F、数字0、セミコロンの8つの文字からなる文字列として解釈される。
整形式XML文書は、とりわけ、次に示す規則に適合しなければならない。
空要素ではない要素は開始タグと終了タグの両方によって境界が定められる。
空要素は空要素タグ (自分自身で開始タグと終了タグの2つの機能を兼ねるタグ) で記述することができる。例えば <私は空です/> のように記述することができる。この例は <私は空です></私は空です> と意味的に同等である。
属性値は全てシングルクォート (') かダブルクォート (") のいずれかで括る。シングルクォートで始められた属性値はシングルクォートで終わり、ダブルクォートで始められた属性値はダブルクォートで終わる。
タグは入れ子の構造をとることができる。ただしタグがオーバーラップしてはならない。ルート要素ではない要素のおのおのは、必ず別の要素に含まれる。
XML文書は宣言された文字符号化方式 (文字コード) にしたがって記述される。文字符号化方式は、XML文書がHTTPを介して転送される場合に "Content-Type" ヘッダをつけるように暗黙的にXML文書の外部で指定しても良いし、XML文書の内部で文書の先頭のXML宣言内で宣言しても良い。このような宣言がない場合、Unicodeの文字符号化方式が使われていると仮定される。XML文書の最初のバイトをみて、UTF-16のバイト順マークと合致すればUTF-16であると仮定する。合致しない場合はUTF-8であると仮定する。
要素の名前ではアルファベットの大文字と小文字とが区別される。例えば、次の例は整形式である。
<Abc> ... </Abc>
しかし次の例は整形式ではない。
<ABC> ... </abc>
XML文書のスキーマを設計する際に、XMLの要素の名前を注意深く選択すると、そのスキーマに準拠したXML文書のデータの意味を、第三者に伝えるために有効であろう。XMLの要素の名前を注意深く選択することにより、そのスキーマに準拠したXML文書は、人間にとって読みやすいものとなる。
XMLの要素と属性の名前を、体が名を表すように注意深く選択決定することで、人間がXML文書を読む際に、要素と属性の意味を、外部の説明文書を参照することなく、よりよく理解できるようになる利点が生まれる。ただしこのような作業を行うことは、XML文書の冗長性が増えることでもある。
人によっては、XML文書を書く際の労力が増えることを、好まない場合がある。またファイルサイズも大きくなることになる。ただし圧縮技術をXML文書に適用してファイルサイズを小さくすることは可能である。