Extensible Markup Language
整形式XML文書を正確に書くためには、ここまで述べたことよりずっと多くの規則にしたがう必要がある。例えば、XML名前空間を使うことや、XMLでの「名前」として使うことができる正確な文字集合を使って、XML文書を書くことなどである。とはいえ、ここまで述べた整形式文書に関する概略を理解しておけば、多くのXML文書を読み理解しあるいは多くのXML文書を書くために必要な基礎は、身についたといえる。
XML文書の正当性を自動的に検査するための方法を説明する。
あるXML文書が、整形式XML文書としての条件のみを満たした文書であるか、それとも妥当なXML文書としての条件をも満たした文書であるかを、判別することは、比較的容易である。というのも、整形式XML文書であるための規則と、XMLの妥当性検証のしくみについては、XML文書を扱うツールの移植性を考慮して設計されているからである。つまりこの設計方針は、XML文書を扱うツールであれば、どのようなXML文書でも扱うことができるということである。
独立したツールを使い、XML文書の正当性を自動的に検査する例を示す。
XML文書を扱えるウェブブラウザで、例えば Mozilla Firefox や Internet Explorer などで、XML文書をロードする。
xmlwf のようなツールを使う (XMLプロセサの実装の一つである Expat に通常は同梱されている)。
何らかのプログラミング言語を使って文書を構文解析する。例えばプログラミング言語Rubyでは次のようになる。
irb> require "rexml/document"
irb> include REXML
irb> doc = Document.new(File.new("test.xml")).root
妥当なXML文書について詳しく説明する。
XMLでは、要素に名前を付けることができ、階層構造をとることができ、スキーマ言語 (Document Type Definition など) により用途に沿うように定義されたスキーマを使うことで要素と属性の意味を公開し説明することができる。XMLのこうした特徴により、目的に応じたXMLに準拠したマークアップ言語を創るための、構文的な基礎が成り立っている。
スキーマは、制約の集合を記述することにより、XML文書の構文上の規則を単に補足するのみである。スキーマは、多くの場合、要素と属性の名前を限定し、各要素が内容とするものの階層構造を規定し、属性の内容を規定する。例えば、「誕生日」という名前の要素では、「月」という名前の一つの要素と「日」という名前の一つの要素をもつことができ、「月」要素と「日」要素のそれぞれは文字列データのみをもつことができる。
スキーマに定義された制約には、データ型の割り当てを含むことができる場合がある。
データ型を割り当てることにより、データ型が割り当てられた情報がどのように処理できるかを、規定することができる。
例えば、「月」要素の文字列データは、そのXML文書で採用したスキーマ言語の機能に準拠して、「1」から「12」までの数字のみが妥当であるという形で、定義することができる可能性がある。ここでスキーマ言語の (データ型に関する) 機能とは、おそらく特定の方法で形式にしたがって記述しなければならないということだけでなく、別のデータ型の値であるかのように処理されることを未然に防ぐことを、意味する。
何らかのスキーマに準拠したXML文書は、整形式であるということに加えて、妥当 (valid) であるということが成り立つ。
XMLのスキーマは、XMLの文書型 (文書の種類、文書の論理的構造) を記述したものである。
多くの場合スキーマは、その文書の構造と内容に関する制約という形で表現される。XMLのスキーマは、XML仕様で規定されている、整形式XML文書としての基本的な制約に加え、それ以上の制約をXML文書に課すことができる。XMLのスキーマ言語は、標準規格のものもプロプライエタリなものも含めて、こうしたスキーマを表現するという目的のもと、数多く存在している。いくつかのスキーマ言語では、スキーマ自身をXML文書として記述する。
スキーマ言語の記述能力はスキーマ言語ごとにさまざまである。例えばスキーマ言語の一つである Document Type Definition (DTD) では、XML文書がとるべき構造の主な規則として、そのDTDに準拠したXML文書で使うことができる要素の名前、要素の内容モデル、要素で指定できる属性の名前、属性の値のデータ型を、記述することができる。
なお、要素の内容モデルとは、要素の内容に出現可能な要素やデータとその順番、および要素の出現回数を規定したもののことをいう。
Standard Generalized Markup Language (SGML) やXMLなどの汎用的なデータ記述言語が世に出る前は、ソフトウェア設計者は、複数のプログラムの間でデータの受け渡しをするために、自分自身でを定義するか、ちょっとしたコンピュータ言語を定義しなければならなかった。このため受け渡しするデータの詳細な仕様やその他の文書を書かなければならなかったし、文書の書き手を別途に確保しなければならないこともあった。
XMLが一定の構造をもち厳密な構文解析の規則をもつことで、ソフトウェア設計者は構文解析の作業を標準的なソフトウェアツール (妥当性検証器、バリデータ) に任せることができる。そしてXMLには、用途に特有の言語を開発するための一般的な、データモデル指向の枠組みがある。
このためソフトウェア開発者は、比較的高水準の抽象度において、自分たちが扱うデータの規則の開発に専念するだけでよい。
XML文書をスキーマに照らして妥当性検証を行うための、十分にテストされたツールが、数多く存在している。XML文書をスキーマに照らして妥当性検証を行うためのツールを、妥当性検証器 (バリデータ) という。妥当性検証器は、スキーマに表現された制約にXML文書が準拠しているかについて、自動的に妥当性検証を行う。
妥当性検証器は、XMLプロセサ (XMLパーサ) に含まれていることもあれば、XMLプロセサとは別に提供されていることもある。
これまでに述べたスキーマの使い方とは別の使い方も存在する。
例えば、XMLエディタは、XML文書の編集を支援するためにスキーマを使うことができる。こうしたXMLエディタでは、妥当な要素名や妥当な属性名を提示することなどができる。
XMLのための最も歴史の古いスキーマ言語は Document Type Definition (DTD、文書型定義) である。DTDは、XMLの前身であるSGMLから引き継がれた。DTDは XML 1.0 標準に含められているため、ほとんどあらゆるXMLプロセサがDTDを扱うことができる。しかし2007年現在ではDTDを使うことは限定的な範囲にとどまっているようである。その理由は次のとおりである。
DTDではXMLで新しく開発された機能を使うことができない。特にXML名前空間を扱えないことが厳しい。
DTDは表現力が乏しい。DTDではいくつかの形式的な視点からXML文書を扱うことができない。
DTDによるスキーマはXMLではない独自の構文で記述する。この構文は、XMLの前身であるSGMLから引き継いでいるという、経緯がある。XML 1.0 の制定当時はDTD以外のスキーマ言語は存在しなかった。
DTDは現在も多くの用途で使われている。その理由は、一定の人々にとってはDTDは他の新しいスキーマ言語よりも読みやすく書きやすいと考えられているからである。
XML Schema は、World Wide Web Consortium (W3C) により開発された、DTDの後継となる新しいスキーマ言語である。
非公式には、XSDと呼ばれることもある。XSDは、XML Schema のインスタンス (スキーマ) を意味する "XML Schema Definition" の頭字語である。
XML Schema は、豊富なデータ型を扱うことができるスキーマ言語である。XML文書の論理的構造について、DTDより詳細な制約を記述することができる。そしてDTDより詳細な妥当性検証の枠組みのもとで、妥当性検証が行われる。他にも、XMLによるマークアップ言語のスキーマの記述能力において、DTDと比べて非常に高いという長所も備えている。
また、XML Schema によるスキーマ自体を、XMLに準拠した形式を使って記述する。XML Schema のスキーマ自体がXMLに準拠することで、スキーマを編集したりスキーマに何らかの処理を行うために、普通のXMLツールを使うことができるようになる。
ただし、XML Schema の妥当性検証器を実装する作業には、単にXML文書を読むことができる能力よりも、非常に多くの知識と能力を必要とする。
XML Schema に対しては賛否両論がある。XML Schema に対する批判の一部を示す。
XML Schema の仕様は非常に膨大な分量がある。そのため XML Schema を理解することは難しい。またそのため XML Schema の妥当性検証器を実装することも難しい。
XML Schema でスキーマを記述する際、XMLに準拠した構文で記述する (記述しなければならない) のは、冗長である。このことが XML Schema のスキーマを理解することやスキーマを記述することを、DTDよりしんどい作業にしてしまっている。
XML文書の構文解析をした後に行う、XML Schema のスキーマによる妥当性検証は、費用が高くつく可能性がある。特にサイズの大きいXML文書の妥当性検証を行う際には、深刻な問題になる可能性がある。
XML Schema のデータモデリング能力は非常に限られている。属性の内容によってその要素の内容モデルを変更することはできない。
XML Schema における型派生モデルは、非常に限られた能力しかない。特に拡張による派生は、かなり使いにくい。
データベースと連携するためのデータ転送機能は、不可解な考え方によって実現されている。nillability (SQLデータベース用語でいうNULLに相当する状態をとることが可能であるという特性) は備えているが、出版業界の要件は満たしていない。
key/keyref/uniqueness の機構は、データ型を考慮していない。
スキーマ検証後情報集合 (PSVI、Post Schema Validation Infoset) の概念は、標準のXML表現やアプリケーションプログラミングインタフェース (API) をもたない。このため、妥当性の再検証を行わない場合、ベンダ非依存の考え方に反する (#情報集合への追加情報を参照)。
RELAX NGは人気のあるもう一つの新しいスキーマ言語である。2001年12月にOASIS (構造化情報標準促進協会) で仕様が策定された。ISO (国際標準化機構) にて定められた国際標準でもある。ISOでは、文書スキーマ定義言語 (DSDL) の一部分を構成する仕様として位置づけられている。
RELAX NGのスキーマの記述方法は、2つの形式がある。XMLに準拠した構文 (XML構文、xml syntax) と、XMLに準拠しない短縮構文 (compact syntax) である。短縮構文は、読みやくすることとより書きやすくすることを目指している。ただし、短縮構文で記述されたスキーマをXML構文のスキーマに変換する方法と、その逆の変換を行う方法は、予め定義されているので、ジェームズ・クラークが開発した  を使えば、標準のXMLツールを使う利便を享受することができる。
RELAX NGはXML Schemaよりも簡潔なスキーマ定義と簡潔な妥当性検証の枠組みを、備えている。そのためRELAX NGは、XML Schema と比べて、使いやすく、またRELAX NGの妥当性検証器を実装することも容易になっている。
RELAX NGもまた、データ型フレームワークプラグインを使う機能を備えている。
RELAX NG でスキーマを記述する人は、例えば、XML文書でXML Schemaのデータ型の定義に適合させたいと考えるかもしれない。
そして RELAX NG では、データ型フレームワークプラグインを使うことにより可能となっている。
ISO 文書スキーマ定義言語 (DSDL; Document Schema Description Languages) 標準は、小規模なスキーマ言語の広範なセットを共に提供する。DSDLを構成する複数の仕様のそれぞれが、特定の問題に対応するために特化されている。DSDLはRELAX NGのXML構文と短縮構文、スキマトロン、データ型ライブラリ言語、文字レパートリ記述言語、文書スキーマ再命名言語、名前空間に基づく検証委譲言語 (NVDL) を、含んでいる。DSDLスキーマ言語群はXML Schemasを支持するベンダの支援は2007年の時点ではまだ受けていない。DSDLは出版のための機能が欠如していることに対する、出版業界の一定の草の根の反応でもある。
いくつかのスキーマ言語では、特定のXML文書の構造を記述する能力に加えて、個々のXML文書をその特定のXML文書構造に適合するように変換する機能も、限定的ながら備えている。
DTDとXML Schemaはこの変換機能を備えている。
DTDと XML Schema では、XML文書に属性の既定値を与えることができる。RELAX NGとスキマトロンは、意図的にこの機能を外している。
例えば、XML情報集合を正確に扱うことが、RELAX NGとスキマトロンの仕様策定時に変換機能を外した理由の一つである。
XML文書を視覚的に表示するための方法を説明する。
XML文書は、その文書の内容をどのように視覚的に表示するかという情報を、一切含んでいない。
Cascading Style Sheets (CSS) や Extensible Stylesheet Language (XSL) のようなXMLのためのスタイルシート言語を使うのでなければ、ほとんどのウェブブラウザは普通のXML文書を生のXMLテキストとして描画する。いくつかのウェブブラウザは「ハンドル」をつけて表示する (例えば、余白に + と - の符号を表示する)。ハンドルを使うことにより、XML文書構造の部分木を、マウスクリックで展開したり折りたたんだりすることができる。
CSSを使ってウェブブラウザでXML文書を描画するためには、XML文書は次のような要領でスタイルシートへの参照を含めなければならない (XMLの処理命令を使ってスタイルシートを使って描画する旨を指定している)。
この方法は、HTML文書におけるスタイルシート指定の方法とは異なる。HTML文書では <link/> 要素を使ってスタイルシートを指定する。
XML文書を視覚的に表示するために、Extensible Stylesheet Language(XSL、拡張可能なスタイルシート言語)を使うこともできる。XSLを使う場合は、XML文書をXHTML/HTML文書の構造に変換するか、もしくはウェブブラウザで視覚的に表示することができる他の文書の構造に変換する。
クライアント側でXSL Transformations (XSLT) のスタイルシートを指定するためには、XML文書に次のようにXSLTスタイルシートへの参照を含めることが、必要である(XMLの処理命令を使って実現している)。
クライアント側のXSLTスタイルシート処理機能は、現在では多くのウェブブラウザが備えている。
別の方法として、このような利用者が常用しているウェブブラウザの能力に依存する方法を採らずに、サーバ側でXSLを使ってXML文書を視覚化可能な形式に変換する方法も、行われている。利用者は、「舞台の裏側で」何が行われているかを、意識する必要はない。実際に目にするものは、よく整形され視覚化された文書だけである。
XMLを拡張する技術を説明する。
XML Path Language (XPath)
XML Path Language (XPath) を使うと、XML文書の個々の部分を参照することができるようになる。XPathは、XSLT、XSL-FO、XQuery などの他の技術に対して、XML文書のデータに対するランダムアクセスを行う機能を、提供する。XPathで記述された式は、XML文書を構成するXML要素、属性、処理命令、コメントなどの内側の、テキスト、データ、値を参照することができる。XPathの式は、要素の名前と属性の名前にアクセスすることもできる。Xpathは、妥当なXML文書に対しても整形式XML文書に対しても使うことができる。また名前空間が定義されたXML文書に対しても、名前空間が定義されていないXML文書に対しても使うことができる。
XML Inclusions (XInclude)
XML Inclusions (XInclude) の仕様は、XML文書内に外部ファイルの全内容もしくは外部ファイルの一部の内容を含める機能を、定義している。XML文書においてXIncludeの処理が終了すると、XInclude処理終了後のXML情報集合にはXIncludeの要素はなく、XIncludeの要素の代わりにそこに外部の文書もしくは文書の一部の複製が、最終的な情報集合に含まれている。XIncludeでは、外部文書の一部をXML文書に含める際に、外部文書の複製対象の領域を参照するためにXPathを使っている。
XQueryは、XMLにおいて、関係データベースにとってのSQLやPL/SQLに相当する、問い合わせ言語としての機能を提供する。XML文書にアクセスし、XML文書を操作(編集)し、その結果をXML文書の形で返す。
XML名前空間 (Namespaces in XML)
XML名前空間 (Namespaces in XML) を使うことで、同一のXML文書内で異なる複数のボキャブラリ(スキーマ)に由来する要素と属性を、名前の衝突を発生させることなく、含めることができる。後述する。
XML Signature の仕様は、XML文書の内容に対して電子署名を生成するための構文と処理規則を定義する。
XML Encryption の仕様は、XML文書の内容に対して暗号化を行うための構文と処理規則を定義する。
XML Pointer Language (XPointer)
XML Pointer Language (XPointer) は、XMLに基づいたインターネットメディアのコンポーネントを指し示す体系である。
XML文書はさまざまなMIMEタイプで配布することができる。RFC 3023 は、"application/xml" および "text/xml" のMIMEタイプを定義する。
"application/xml" と "text/xml" のMIMEタイプは、そのデータがXML文書の形式をとっているということのみを述べているだけであり、そのXML文書の論理的構造については何も述べていない。
"text/xml" を使うことに対しては、符号化に関する問題が生じる可能性があるとの批判があり、現在では非推奨とされている。RFC 3023 では、加えて、XML文書を "application/" で始まり、"+xml" で終わるMIMEタイプで配布することを勧めている。例えば、AtomのXMLデータに対しては、"application/atom+xml" のMIMEタイプで配布するのである。
XML名前空間 (Namespaces in XML) は、一つXML文書内で、異なる複数のボキャブラリ(スキーマ)に由来する要素と属性を、名前の衝突を発生させることなく、含めることができるようにするための仕様である。World Wide Web Consortium (W3C) から、1999年1月14日に Namespaces in XML 1.0 が勧告された。XML文書に異なる複数のボキャブラリに由来する要素と属性を含める場合、ボキャブラリのそれぞれに名前空間をわりあてることにより、要素名の衝突と属性名の衝突の問題を、解決することができる。
一つの名前空間において定義された要素の名前は、一意でなければならない。
顧客への参照と注文された商品への参照を含む簡単なXML文書の例を考える。顧客要素と商品要素は、ともに「識別番号」という名前の子要素をもつことがあるだろう。識別番号要素への参照は、顧客要素の子要素の識別番号要素も商品要素の子要素の識別番号要素も同じ要素名をもつので、あいまいである。しかし2つのボキャブラリを区別する2つの名前空間のもとで識別番号要素を使う場合、顧客要素の子要素の識別番号要素と商品要素の子要素の識別番号要素は意味的に明確に異なる2種類の要素となる。
名前空間は、XMLの予約属性である xmlns を使って宣言される。xmlns属性の属性値はIRI (Internationalized Resource Identifier) である必要があり、通常はURI (Uniform Resource Identifier) である。
例を示す。
xmlns="http://www.w3.org/1999/xhtml"
この例の "http://www.w3.org/1999/xhtml" を名前空間名という。ここで注意すべきこととしては、名前空間の宣言で記述されたURIは、実際にインターネット上の住所として解釈されるわけではないということである(自由に考えよう、URIほど便利なものが必ずインターネットのアドレスをささなければいけないなどと、誰が決めたのか)。例えば、自体には何のコードもない。このURIの文書では、人間の読者に対してXHTMLについて簡単に説明しているだけである。
("http://www.w3.org/1999/xhtml" のような) URIを名前空間の識別子として使うことで、("xhtml" のような)単純な文字列を名前空間名として使うよりも、異なる名前空間が意図せずして同じ名前空間名を使ってしまう危険性を低減する。名前空間の識別子は、ウェブの住所(アドレス)の慣習にしたがう必要はない。
名前空間の宣言は短い接頭辞を含むことができる。この名前空間接頭辞を使うことで、異なるボキャブラリに由来する要素と属性を識別することができる。
名前空間接頭辞を使う例を示す。
xmlns:xhtml="http://www.w3.org/1999/xhtml"
XML名前空間を使ったXML文書の例を示す。
このXML文書は、次の2つの名前空間のボキャブラリから構成されている。
XSLTのボキャブラリ: xslの名前空間接頭辞をもち、名前空間名は "http://www.w3.org/1999/XSL/Transform"。
XHTMLのボキャブラリ: 名前空間接頭辞をもたないデフォルトの名前空間であり、名前空間名は "http://www.w3.org/1999/xhtml"。
なおこのXML文書は、あるXML文書をXHTML文書に変換するXSLTスタイルシートである。
XML名前空間を使う場合、そのXML名前空間のボキャブラリが定義されていることが必要であるわけではない。しかしXML文書でXML名前空間を使う場合に、そのXML名前空間のボキャブラリを定義しておくことは、そのXML名前空間のURIのもとで正しい文書構造を定義しているスキーマに関連づけるために、行われることが多い。
プログラマやアプリケーションソフトウェアがXML文書を処理する手段としては、これまで次に示す3つの技法が伝統的に使われてきた。なお、この節の説明で使うAPIとはアプリケーションプログラミングインタフェースのことをさす。
プログラミング言語と SAX API を使う。
プログラミング言語と DOM API を使う。
変換エンジンとフィルタを使う。
さらに、近年に開発され使われるようになった、XML文書を処理する技法を示す。
Pull Parsing
Simple API for XML (SAX) は、字句解析を行いイベント駆動で処理を行う API である。SAXを使うとXML文書は文書の最初から順次読み込まれ、その内容はプログラマが実装したハンドラオブジェクトの様々なメソッドへのコールバックとして報告される。SAXを使ったXML文書処理は高速であり、少ないコンピュータ資源を効率的に使って非常にサイズの大きいXML文書を処理することが可能である。
SAXを使うことに伴う問題は、XML文書に対してランダムアクセスを行って情報を取り出すことが難しいことである。そのため、SAXを使うに際し、プログラマはXML文書のどの部分が現在処理対象となっているか把握する為の機構を実装しなければならない。
SAXは、処理対象となるXML文書中のある種類の情報がどの部分に出現するかに依らず、常に同じように処理されると保証できる場合に用いるのが望ましい。
Document Object Model (DOM) は、インタフェース指向のAPIであり、XML文書のおのおのの部分を表現する節オブジェクトの集まりからなる木構造であるかのように、XML文書全体に対してナビゲーションを行うことを想定している。DOMでは、XML文書に対してランダムアクセスを行って情報を取り出すことが、簡単にできる。
DOMにおけるXML文書全体に相当する Document オブジェクトは、XML文書をXMLプロセサが処理することにより生成することもできるし、プログラマがプログラミングすることによって生成することもできる。DOMにおける Node (節) のさまざまな型のデータ型は、DOM仕様においては抽象的にインタフェースとして定義されている。Node のデータ型の実装は、プログラミング言語に固有の言語バインディングを提供する。
DOMの実装は、サイズの大きいXML文書を扱う場合はたくさんのメモリを使う。なぜならDOMの実装は、一般的にはXML文書全体からオブジェクトの木構造を構築してメモリにロード(展開)し、その後にDOMを介した処理をできるようにしているからである。
Javaでは、標準ライブラリを構成するいくつかのパッケージでDOMが実装されており、Javaのプログラマは標準ライブラリのDOMを使うことができる。DOMの仕様は、World Wide Web Consortium (W3C) で策定されているため、DOMで中核をなす Node やDocument などのインタフェースや、直列化 (出力) などの機能を提供するためのインタフェースはパッケージ org.w3c.dom.* に収められている。
Extensible Stylesheet Language (XSL) 技術におけるフィルタは、XML文書に対して、視覚的に出力したり印刷出力できるよう変換処理を行うことができる。
XSL Formatting Objects (XSL-FO)
XSL Formatting Objects (XSL-FO) は、World Wide Web Consortium (W3C) が策定した、XMLに準拠した宣言的なページ整形 (組版) 言語である。XSL-FO処理系を使うと、XSL-FO文書を他の非XML形式 (PDFなど) に変換出力することができる。
XSL Transformations (XSLT)
XSL Transformations (XSLT)は、W3Cが策定した、XMLに準拠した宣言的な文書変換言語である。XSLT処理系を使うと、XSLTスタイルシートを指示書として、XML文書として表現されたあるデータの木構造を、別の木構造に変換することができる。変換後の文書として、XML (例えば、XSL-FO文書やXHTML文書など)、HTML、プレーンテキストなどの形式にすることができる。またXSLT処理系によってはこの他の形式に変換できるものもある。
XQueryは、W3Cが策定した、XML文書に対する、問い合わせ、構築、変換を行うための、コンピュータ言語 (問い合わせ言語) である。