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 stands for Extensible Markup Language. The X is for the first syllable of Extensible. eXtensible is a spelling error." - ウェイバックマシン(2010年5月11日アーカイブ分)。
概要 基礎的概念と利用目的 XMLは、個別の目的に応じたマークアップ言語を定めるための汎用的言語であり、「タグの入れ子」式の構文が拡張性を容易にするとして「extensible」を謳っている。
データ構造としては木構造になるため、巡回があるようなネットワーク構造を直接扱うことはできない(XLinkなどの提案がある)。
XMLの最も重要な目的は、異なる情報システムの間で構造化された文書や構造化されたデータの共有を容易にすることである。
HTMLとXMLの違い Webページを記述するマークアップ言語であるHTMLは、XMLと文法がよく似ている。これはどちらもSGMLが元になっているためである。
HTMLが特定目的のための言語であるのに対し、XMLはHTMLのような特定目的のための言語を新たに定めるための仕組みであり、タグを定義する事でXMLベースのマークアップ言語を定義することができる。実際、HTMLと同等の機能をXMLによって定義したXHTMLが開発されている。
XMLを基盤とするマークアップ言語とスキーマ言語 XMLで文書の論理的構造を規定する制約を追加することによって、XMLを適用したマークアップ言語を実装できる。XMLを適用したマークアップ言語は非常に多く存在している (#XMLの応用の節を参照)。例えば、Extensible HyperText Markup Language (XHTML)Extensible HyperText Markup Language (XHTML) は、マークアップ言語 HyperText Markup Language (HTML) を簡素化しその一貫性を改良しようという試みである。なお、HTMLは、Standard Generalized Markup Language (SGML) に基づいたマークアップ言語である。、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文書を視覚的に表示する、#XML情報集合を参照)。 以下に挙げるものをはじめとして、現在も多くの関連技術の標準化作業が行われている。
プログラムからXML文書を処理する方法として、Document Object Model (DOM) や Simple API for XML (SAX) などのアプリケーションプログラミングインタフェース (API) が標準化されている他の方法でXML文書を処理することも可能である。
XML文書のスタイルを指定する技術(スタイルシート)として Extensible Stylesheet Language (XSL) や Cascading Style Sheets (CSS) などがある。
XML文書を非テキスト形式(バイナリ)で効率的に表現する方法として、World Wide Web Consortium (W3C) は Efficient XML Interchange (EXI) フォーマットを定義した。
XMLの普及とXMLへの批評 XMLは現在、広く普及している技術であるが、その技術的な有用性などについて、肯定的に評価する人々が多い一方で、批判的に評価する人々も多い (#XMLに対する支持と批判を参照)。
整形式XML文書と妥当なXML文書 XML文書の正当性の水準には、整形式XML文書と妥当なXML文書の、2つの水準がある。なおXML文書に対して、整形式XML文書としての検査のみを行うXMLプロセサを非検証XMLプロセサといい、整形式XML文書としての検査に加えて妥当なXML文書としての検査を行うXMLプロセサを検証XMLプロセサという。
整形式XML文書 整形式XML文書 (well-formed XML document) は、XMLの構文の規則のすべてに準拠している。例えば、文書中のある要素が開始タグが有るが対応する終了タグが欠落している場合、その文書は整形式 (well-formed) ではない。整形式ではない文書はXML文書とはみなされない。非検証XMLプロセサおよび検証XMLプロセサは、整形式ではない文書を処理することはできない (処理を試みるとエラーになる)。 妥当なXML文書 妥当なXML文書 (valid XML document) は、整形式XML文書としての条件を満たしていることに加えて、文書の論理的構造を規定する何らかの規則に準拠している。このような規則は、RELAX NG や XML Schema、Document Type Definition (DTD、文書型定義) などのスキーマ言語で定義されたスキーマで定める。例えば、あるXML文書がスキーマに定義されていない要素 (タグ) を含んでいた場合、検証XMLプロセサは、そのXML文書を処理することはできない。検証XMLプロセサによって検証されたXML文書は、妥当 (valid) であると位置づけられる。なお、妥当な文書であっても、非検証XMLプロセサでは実体の定義を確認しないため、仕様で定められている実体参照(<、>など)以外の私的な実体参照を用いている場合、非検証XMLプロセサは当該実体を参照できず致命的なエラーとなる。
XMLの構文と整形式XML文書 整形式XML文書が満たすべき構文の規則を説明する。
整形式XML文書としての条件が満たされることのみを考慮する場合 (スキーマ言語を使わずに手軽にXMLを使う場合) においても、XMLは、大量の文書やもしくは木構造として表現することができるデータを格納するための、一般的な枠組みとしての役割を果たすことができる。
XML文書は、要素 (element) と属性 (attribute) が複数集まって、構成されている。 要素は内部に子要素を含むことができる。属性は要素に付随し、属性の内部に子要素を含むことはできない。要素は開始タグと終了タグで内容を挟むことで表現する。 開始タグは「」、終了タグは「」で記述する。
一つの要素を記述するための基本的な構文を次に示す。
<要素名 属性="値">内容</要素名>
ここで、<要素名 属性="値"> をこの要素の開始タグといい、</要素名> を終了タグという。「内容」は何らかのテキストである。
次に示す例は整形式XML文書である。
<書籍 出版日="2007-10-31">これは書籍です.... </書籍>
この例は、書籍という要素を一つもつXML文書である。<書籍> が書籍要素の開始タグであり、</書籍> が書籍要素の終了タグである。「出版日="2007-10-31"」は書籍要素の属性である。この属性の名前 (属性名) は「出版日」であり、この属性の値 (属性値) は "2007-10-31" である。「これは書籍です.... 」は、書籍要素の内容である。
要素の内容を構成するテキストはまた、さらに任意の数の要素を含むことができる (なお、このように一つの要素内に文字列データと子要素が混在するものを、「混合内容」と呼ぶ一つの要素の内容として文字列データのみを含むものは、混合内容ではない。また内容のない「空要素」も混合内容ではない。一つの要素の内容がいくつかの子要素だけから構成されるものも、混合内容ではない。)。 すなわち、一般的なXML文書は木構造をなす。 この点において、XMLはプログラミング言語LISPのS式と似ている。 S式でも木構造を記述する。S式の木構造のおのおのの節は、自分自身のプロパティリストをもつことができる。
要素は内部に別の要素を含むことができる。構造化したXML文書の例を示す。
<レシピ 名前="パン" 準備時間="5分" 調理時間="3時間"> <料理>基本的なパン</料理> <材料 量='3' 単位='カップ'>小麦粉</材料> <材料 量='0.25' 単位='オンス'>イースト</材料> <材料 量='1.5' 単位='カップ' 状態="温かい">水</材料> <材料 量="1" 単位="ティースプーン">食塩</材料> <要領> <手順>全ての材料を一緒にして混ぜます。</手順> <手順>十分にこねます。</手順> <手順>布で覆い、暖かい部屋で1時間そのままにしておきます。</手順> <手順>もう一度こねます。</手順> <手順>パン焼きの容器に入れます</手順> <手順>布で覆い、暖かい部屋で1時間そのままにしておきます。</手順> <手順>オーブンに入れて温度を180℃にして30分間焼きます。</手順> </要領> </レシピ>
要素の属性の値は、必ずシングルクォート (') かダブルクォート (") で括らなければならない。そして要素内にある属性は、互いに属性名が異なっていなければならない。XML文書では要素は正しく入れ子になっていなければならない。要素は決してオーバーラップしていてはならない。
例えば、次の文書は整形式XML文書ではない。なぜなら 書名 要素と 著者 要素がオーバーラップしているからである。
<!-- 正しくありません! 整形式XML文書ではありません! --> <書籍目録> <書名>XML入門<著者>筒井<書名>続・XML入門<著者>小松</書名></著者></書名></著者> </書籍目録>
次の2つの文書は整形式XML文書である。 <!-- 正しい整形式XML文書です --> <書籍目録> <書名>XML入門</書名> <著者>筒井</著者> <書名>続・XML入門</書名> <著者>小松</著者> </書籍目録> <!-- もう一つの正しい整形式XML文書です --> <書籍目録> <書名>XML入門</書名> <著者>筒井<書名>続・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 version="1.0" encoding="UTF-8"?> <書籍 出版日="2007-10-31">これは書籍です.... </書籍>
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文書の例を示す。
<書籍 出版日="2007-10-31"> <!-- これはコメントです.... --> これは書籍です.... </書籍>
内容のない要素を空要素 (empty element) という。XMLでは、空要素を表現するために特別な構文を使うことができる。開始タグを書きその直後に終了タグを書くこともできるが、その代わりに空要素のタグを使うことができるのである。空要素タグは開始タグと似ているが、閉じ括弧の直前にスラッシュをおく。
次の3つの例は、XMLでは同等である。
<foo></foo> <foo/> <foo />
空要素タグは属性を含むことができる。
<情報 著者="小松左京" 分類="サイエンスフィクション" 日付="2009-01-01"/>
多言語環境で使う XML文書ではどのUnicodeの文字も (XMLで特別な意味をもつ、開き山括弧 "<" のような文字を除いて)、要素名として、属性名として、コメント内容として、文字データとして、処理命令 (後述) として、直接に使うことができる。このため、漢字とキリル文字を共に含む次の文書も、整形式XML文書である。
<?xml version="1.0" encoding="UTF-8"?> <俄語>Данные</俄語>
文書型宣言 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を構成する宣言群のうち、文書型宣言内に直接記述された宣言群のことである株式会社日本ユニテック、中山幹敏、奥井康弘、2001年、p.132。
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文書の一部となるデータを格納しているもののことである株式会社日本ユニテック、中山幹敏、奥井康弘、2001年、p.139。置換文字列を使う事例としては、次のような場合がある。 キーボードから簡単には入力できない文字をXML文書中に表現したい場合。 決まった単語の並びがXML文書中に何度も出現する場合。
実体参照の構成は、まず最初にアンパサンド ("&") があり、その後に実体の名前が続き、セミコロン (";") で終わる。
XMLには、事前宣言された実体として次の表に示す5つの実体がある。
実体参照 実体 実体の説明& & アンパサンド (ampersand)< < 小なり (less than)> > 大なり (greater than)' ' アポストロフィ (apostrophe)" " クォーテーションマーク (quotation mark)
「AT&T」の名前でアンパサンドを表現するために、事前宣言されたXMLの実体を使う例を示す。
<会社名称>AT&T</会社名称>
事前宣言された実体以外の実体を宣言する必要がある場合、XML文書の Document Type Definition (DTD、文書型定義) の内部で宣言する。
XML文書の内部に定義されたDTDを使って、置換文字列としての実体を宣言して、実体参照を使う例を次に示す。宣言された実体は、一つの文字であっても良いし、テキストの断片であっても良いし、他の実体への参照を含むテキストであっても良い。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE 例 [ <!ENTITY copy "©"> <!ENTITY copyright-notice "Copyright © 2007 平成新報社"> ]> <例> ©right-notice; </例>
XMLに準拠したブラウザを使うと、先のXML文書は次のように表示される。
Copyright © 2007 平成新報社
ファイルの実体を参照するXML文書の例を示す。
<?xml version='1.0' encoding='UTF-8'?> <!DOCTYPE 文章 [ <!ENTITY tsutsui-yasutaka SYSTEM "another-file.xml"> ]> <文章> <文>星新一はSF作家である。</文> <文>小松左京はSF作家である。</文> &tsutsui-yasutaka; </文章>
なお、別ファイル another-file.xml には次の内容が記されていることとする。
<文>筒井康隆はSF作家である。</文>
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文書では次のように記述することができる。
<会社名称>AT&T</会社名称> <会社名称>AT&T</会社名称>
処理命令 処理命令 (processing instruction) は、XML文書の構成要素であり、XML文書を扱うソフトウェアに対する何らかの処理を行う命令を、記述する内容が、処理命令である。
次に処理命令の構文を示す。
<?処理命令ターゲット 処理内容?>
処理命令は ?> の文字列を除き任意の処理内容を記述することができる。処理命令には、処理内容として擬似属性 (pseudo attribute) を記述することがある。擬似属性は、記述のしかたが属性名と属性値のペアに似ている。しかしXMLプロセサは擬似属性を、属性として解釈せず、処理命令の処理内容として解釈する。
擬似属性を使った処理命令の例を次に示す。