XML: Extensible Markup Language

Takami Torao XML 1.1 #xml

概要

XML (extensible markup language) は構造化されたデータを表現するための W3C が規定するマークアップ言語。ドキュメント指向のデータ向けに高機能で非常に高い柔軟性と拡張性を持っており、また人間が読みやすいように設計されているため、データ交換から設定ファイルまで様々な分野で広く使用されている。

XML は HTML と同様に SGML (standard generalized markup language) から派生したテキストベースの仕様で、データの構造や階層関係をタグを用いて表現することから両者はよく似ている。HTML と異なる点はユーザ自身がタグやその構造を定義できる点 (拡張可能) である。

Table of Contents

  1. 概要
  2. 名前空間
  3. 参照

近年では、単なるデータ記述の用途では目的に対する複雑さや記述量の冗長さから XML よりも JSON や YAML といったより簡易的で軽量なデータ記述言語が好まれている。しかし以下のような利点を考慮したXML の選択も理にかなっている。

  • 標準化: XML の仕様は W3C によって規定されているため、異なる言語やライブラリ、実行環境間での互換性が高く、何十年もメンテナンスが必要なデータの保存や交換形式に向いている。

  • スキーマ: 簡易的なデータ記述言語に比べて最も高い価値の一つは標準化された方法でスキーマを定義できることだろう。XML では XML Schema と呼ばれる書式でデータ構造を定義することができる。アプリケーションはスキーマの定義から外れたデータを容易に検出することができる。また異なるスキーマのデータ構造を一つの文書に混在させることができる。

  • ドキュメント指向: HTML のようにテキストの意味を追加したり、あるいは文書中に埋め込まれたデータを機械的に抽出したりする用途ではマークアップ言語の仕様である XML に利点がある。XHTML はブラウザで表示することもできる。

  • 成熟性: 近年の W3C では XML に関する大きな動きはない。したがって今後新しい機能が取り込まれる期待は薄いが、裏を返せば将来に渡って大きな仕様変更がないことを意味しており、標準化されていることと併せて一度習得しておけば長く使える技術であると言える。

  • HTML との親和性の高さ。

名前空間

XML における名前空間 (namespace) は XML 文書内の要素や属性の名前を一意に識別するための機構である。単一の XML 文書内で異なるスキーマのノードを混在させたときに要素や属性の名前が衝突することを避けるために、それぞれ異なる名前空間を用いて区別することができる。これにより異なる文脈やデータソースを一つの XML 文書に含めることができ、データの構造化と相互運用性が向上する。

名前空間の実体は URI であるため組織や組織内のドメインで区別することができる。架空を含めてどのような URI を用いても良いが、その URI にアクセスしたときに対応する XML-Schema が表示されるようにしておくことが望まれる。

次に示す例は名前空間を省略した XML 文書である。これは文書内のすべての要素や属性がデフォルトの名前空間に属していることを意味している。

<?xml version="1.0" encoding="utf-8"?>
<message>
  hello, world
</message>

名前空間を指定するには xmlns (xml namespace) という特別な属性を使用する。この属性が付けられた要素以下でその名前空間を使用することができる。xmlns の指定がネストしている場合はより深い位置の指定で上書きされる。

次の例は XML 文書内のすべての要素や属性が https://hazm.at/xsd/greeting という名前空間に属していることを意味している。

<?xml version="1.0" encoding="utf-8"?>
<message xmlns="https://hazm.at/xsd/greeting">
  hello, world
</message>

また名前空間は接頭辞 (prefix) と呼ばれる短い文字列にマッピングすることができる。これは xmlns:prefix="uri" のように名前空間を宣言し、その名前空間に属する要素や属性名を prefix:name のように記述する。名前空間の接頭辞付き文書と名前空間の接頭辞を省略した文書は同じであるため、次の例は上の XML 文書と本質的に同じである。

<?xml version="1.0" encoding="utf-8"?>
<greeting:message xmlns:greeting="https://hazm.at/xsd/greeting">
  hello, world
</greeting:message>

接頭辞付きの名前空間を使用することで単一の XML 文書内に異なる名前空間の要素や属性を混在することができる。

例えば日本とアメリカでは郵便番号の体系が異なるが、日本郵政の定義する住所スキーマと米国郵便公社の定義する住所スキーマでは同じ zipcode という要素名を使用しているかもしれない。このような場合でもそれぞれの名前空間に異なる接頭辞を指定することで異なる要素として認識することができる。

<?xml version="1.0" encoding="UTF-8"?>
<zipcodedb
  xmlns="https://hazm.at/xsd/zipcodedb"
  xmlns:jp="https://www.japanpost.jp/schema/address"
  xmlns:us="https://usps.com/xsd/address-system"
>
  <jp:zipcode>123-4567</jp:zipcode>
  <us:zipcode>12345-6789</us:zipcode>
</zipcodedb>

現実的には、XML Schema や XLST を記述するケースにおいて、それらのスキーマとユーザが定義する XML のスキーマを混在させる必要があるため名前空間の理解が必要となる。

参照

  1. W3C: Extensible Markup Language (XML)
  2. W3C: Extensible Markup Language (XML) 1.1 (Second Edition)