XML(eXtensible Markup Language:拡張可能なマークアップ言語)は、インターネット上で使用される様々な技術に関する国際的な標準化団体であるW3C(World Wide Web Consortium)が定めたデータの記述言語です。XMLは、テキスト形式で理解しやすいこと、拡張性があること、また、アプリケーションに依存せず利用可能であることから、コンピュータシステム間でのデータ交換に使用されています。XMLで記述されたデータのファイル拡張子は、xmlです。図1-1に3D都市モデルのXMLデータの例を示します。
図 1‑1 3D都市モデルのXMLデータの例(一部省略)
XMLは、「タグ」と呼ばれる特殊な文字列でデータを囲むことで、そのデータを意味付けます。3D都市モデルではタグは英語で記載されていますが、このチュートリアルでは、記載内容をわかりやすくするために、日本語でタグを記載しています。図1-2に本チュートリアルで使用するXMLデータの例を示します。
図 1‑2 XMLデータの例
この例には、<建物></建物>、<建物名></建物名>、<用途></用途>及び<地上階数></地上階数>という4組のタグが含まれています。
例えば「建物名」というタグは「中央合同庁舎3号館」というデータを囲んでいます。これにより、「中央合同庁舎3号館」が「建物名」であると意味付けしています。また、「用途」というタグは「官公庁施設」というデータを囲んでいます。これにより、「官公庁施設」が「用途」であると意味付けしています。このように、タグでデータを囲むことで、そのデータの意味をコンピュータでも解釈できるようにしています。
ポイント: XMLは、タグでデータの意味付けを行う言語です。
XMLはタグでデータを囲む言語だと説明しました。XMLで使用するタグには、開始タグ、終了タグ、空タグの3種類があります(表1-1)。
表 1‑1 タグの種類と書き方
図1-3に開始タグと終了タグの例を示します。
図 1‑3 XMLデータの要素の構造
この例では、「中央合同庁舎3号館」というデータが「建物名」というタグにより囲まれています。データの前のタグを「開始タグ」、後ろのタグを「終了タグ」と呼びます。開始タグは<○○>、終了タグは</○○>と記述します。このとき、○○の部分は自由に定めることができます。また、開始タグ、タグで囲まれたデータ、終了タグを合わせて、XMLの「要素」と呼びます。
また、「空タグ」は、開始タグと終了タグで囲むデータがない場合に使用されます。空タグは、<○○/>と記述します(図1-4)。空タグは、開始タグと終了タグが1つになったものです。
図 1‑4 空タグ
さらに、XMLは入れ子構造(ネスト構造)で記述することができます。入れ子構造とは、タグで囲むデータとして、別の要素を記述する構造のことを言います。図1-5に入れ子構造で記述したXMLデータの例を示します。
図 1‑5 入れ子構造で記述されたXMLデータ
この例では、「建物」のタグが、「建物名」、「用途」、「地上階数」及び「地下階数」という4つの要素を囲んでいます。これにより、「建物名」、「用途」、「地上階数」及び「地下階数」という4つの要素のまとまりが「建物」データであると意味付けしています。
入れ子構造は、何階層でも深くすることができます。例えば、図1-6では「用途」のタグの中に、「大分類」と「小分類」の要素を記述しています。
図 1‑6 複雑な入れ子構造の例
入れ子構造のXMLデータは、外側の要素を「親要素」と呼び、「親要素」に含まれる要素を「子要素」と呼びます。 図1-6の例では、「建物」が「親要素」であり、「建物名」、「用途」、「地上階数」及び「地下階数」が「建物」の「子要素」です。さらに、「用途」にとっては「大分類」と「小分類」が「子要素」になります。
このように、XMLでは、タグやタグの構造を自由に定めることができます。タグでデータを意味付けする言語には、他にもウェブサイトを記述する言語であるHTML(HyperText Markup Language)等があります。これらの言語は、あらかじめ<body>や<title>といったタグが定められており、HTMLの利用者は定められたタグだけを使ってデータを記述します。これに対して、XMLの大きな特徴は、XMLの利用者がタグを自由に定めることができる(eXtensible:拡張可能な)ことです。
XMLは、タグによって値を意味付けする言語ですので、空タグを除いて、必ず開始タグと終了タグが対として存在しなければなりません。例えば、図1-7のXMLデータは、<建物名>という開始タグに対応する終了タグがありません。この場合、建物名という意味付けを行うべきデータがどこにあるのかを理解することができなくなってしまいます。このようなXMLデータはエラーとなります。
図 1‑7 エラーとなるXMLデータの例
ポイント: XMLの要素は、タグで囲まれたデータのかたまりを指します。開始タグと終了タグが一致しないとエラーになります。
XMLの要素には、属性と呼ばれる付加的な情報を追加できます。属性は、開始タグの中に記述します。XMLの属性は、属性名と属性の値の組み合わせを記述します。
図1-8にXMLの属性の例を示します。
図 1‑8 XMLの属性
この例では、「建物名」というXMLの要素に、「種類」という属性を追加しています。1つ目の要素には、「種類」属性の値として「正式名称」が、また2つ目の要素には「種類」属性の値として「別称」が記述されています。この属性の例では、「建物名」という要素に、「種類」の情報を追加しています。
ポイント: XMLの属性は、XMLの要素への付加的な情報であり、開始タグの中に記述します。
XMLの大きな特徴の1つに、自由にタグを決めることができる拡張性があります。自由にタグを定義すると、自分が定義するタグと他の人が定義するタグが重複してしまう可能性があります。しかし、同じタグだからといって、同じ意味であるとは限りません。
例えば、A社の建物データでは、建物の用途を区別するために「種類」というタグを使用し、B社の建物データでは、建物の構造を区別するために「種類」というタグを使用していたとします。それぞれのデータを個別に利用するときは特に問題は生じませんが、A社とB社のデータを統合したり、交換したりしたい場合は、「種類」というタグが「用途」と「構造」という異なる意味を持つため、混乱が生じます(表1-2)。
このように、同じ名前であっても別の意味を持つタグを区別できなければ、データの統合や交換の支障になります。
表 1‑2 A社B社のタグ名「種類」
同じ名前のタグを識別するための仕組みとして、「名前空間(namespace)」があります。名前空間は、同じ場所で定義された要素等の名前の集合を表す概念です。要素等の「名前」は、それが定義された「名前空間に属する」と考え、属する名前空間が異なれば同一の名前でも異なるものとして扱います。
名前空間を使用すると、例えば、「A社の『種類』」や「B社の『種類』」というように、それがどこで定義されたタグであるのかを明確に区別できるようになります。この例の場合、「A社」や「B社」が名前空間になります。これにより、自分で定義したタグと、他の名前空間で定義されたタグを、名前の重複を気にすることなく利用できるようになります。
名前空間にも、他の名前空間と区別するための名前を付ける必要があります。名前空間の名前には、URI(統一資源識別子:Uniform Resource Identifier)を使用します。URIは、ウェブ上のあらゆるファイルを識別するための識別子です。URIは重複のない識別子ですので、名前空間自身も他の名前空間と重複しません。
名前空間の例を見てみましょう。例えば、OGCが策定した地理空間データに特化したXML形式の記述言語であるGML(Geography Markup Language)の名前空間は、「http://www.opengis.net/gml」です。この「http://www.opengis.net/gml」がURIであり、他の名前空間と重複することはありません。この名前空間では、地理空間情報を表現するための要素を定義しており、ここで定義された要素は、地理空間データをXML形式で記述するために使用されます。
ポイント: 名前空間は、XMLの要素等が宣言される場所であり、異なる名前空間で宣言された同じ名前を区別するための仕組みです。
XMLの要素などの名前は、それが宣言された名前空間に属すると前項で説明しました。それぞれの名前がどの名前空間に属しているかをわかりやすく示すための仕組みが「接頭辞(prefix)」です。接頭辞は、URIで記述された名前空間の短縮名です。
接頭辞は、コロン(:)をはさんでタグと連結させて使用します。図1-9に接頭辞の使用例を示します。
図 1‑9 接頭辞を使用した名前空間の異なる要素の記述例
ここでは、A社の名前空間には、aという接頭辞を、B社の名前空間にはbという接頭辞を付けています。同じ「種類」というタグですが、接頭辞を付けて「a:種類」や「b:種類」と記述することで、A社が定義したタグとB社が定義したタグを明確に区別できます。
接頭辞は自由に設定することができます。接頭辞の設定の仕方は、2.3節で解説します。
W3Cで定義された名前に付ける接頭辞には、xsやxsdが使用されることが多いです。このチュートリアルでは、W3Cで定義された名前には「xs」という接頭辞を使用します。また、本項以降では、このチュートリアルで独自に定めた名前に、接頭辞として「ex」を付けます(図1-10)。
図 1‑10 本チュートリアルで独自に定めた接頭辞の例
ポイント: 接頭辞は、名前空間の短縮名であり、名前と組み合わせることで、どの名前空間で定義された名前であるかを明示できます。
XMLスキーマは、XMLで使用できるタグやタグの構造を定義する文書です。拡張子は、xsdです。XMLスキーマ自身もXMLの構造で記述されます。
図1-11に、XMLデータの例を示します。
図 1‑11 XMLデータの例
このデータでは、「建物名」というタグが使用されています。また、タグで囲まれた値(中央合同庁舎3号館)は文字列です。「建物名」には「ex」という接頭辞が付いていますが、これは、このタグがこのチュートリアルで定めた独自の名前であることを示しています。
このXMLデータで使用されているタグを定義したXMLスキーマを図1-12に示します。
図 1‑12 XMLスキーマの例
「name=“建物名”」で、「建物名」というタグを定義しています。また、「type=“xs:string”」で、この「建物名」というタグに囲まれる内容は、文字列であると定義しています。
このように、XMLスキーマはXMLデータで使用可能なタグやタグの構造を定義する役割を持ちます。
なお、図1-12に示すXMLスキーマには2か所に接頭辞が使用されています。1つ目は「xs:element」、2つ目は「xs:string」です。この「xs」という接頭辞は、「element」や「string」がW3Cで定めた名前であることを示しています。「name=“建物名”」には接頭辞が付いていませんが、これは、名前を宣言するところでは接頭辞を付けず、その名前が呼び出される場所では接頭辞を付けるためです。「element」や「string」は、XMLスキーマの名前空間(http://www.w3.org/2001/XMLSchema)で宣言した要素等を呼び出しているため、接頭辞を付けています。
ところで、XMLデータはXMLスキーマが無くても成り立ちます。この場合、開始タグと終了タグが一致していれば、正しいXMLデータになります。これを「整形式」なXMLと呼びます。また、XMLスキーマがないので、どんなタグが使われていても、どんな構造で記述されていても、かまいません。
一方、XMLデータで使用するタグやその構造を定めたい場合には、XMLスキーマが必要です。この場合、XMLスキーマに定義されたタグやタグの構造に従ったXMLデータでなければ正しいXMLデータにはなりません。XMLスキーマに従っているXMLデータのことを「妥当」なXMLデータと呼びます。XMLスキーマに従ったXMLデータにしたい場合は、XMLデータの中に、どのXMLスキーマに従って作成されているXMLデータであるかを記述します。
ポイント: XMLスキーマは、XMLで使用可能なタグやその構造を定める文書です。
XMLデータは、XMLスキーマに基づいて作成されます。
XMLデータの全体的な構成を図1-13に示します。
図 1‑13 XMLデータの全体構成
XMLデータは、まずファイルがXMLであることを宣言します。次に、XMLスキーマに従ったタグを記述します。このとき、最初に現れるタグを「ルート要素」と言います。この例では、「ex:データ集合」という要素が、ルート要素に該当します。このルート要素の開始タグと終了タグの間に、XMLスキーマに従って個々の要素を記述します。もちろん、ルート要素や、ルート要素の子要素として記述できる要素は、XMLスキーマで定義されていなければなりません。つまり、1つのXMLデータのファイルは、1つの巨大な入れ子構造として構成されることになります。
XMLデータで使用する接頭辞や参照するXMLスキーマは、ルート要素の開始タグの中に、属性として記述します。
接頭辞は、xmlns属性を使用します。図1-13では、「xmlns:ex=http://www.sample.net/1.0」というように、接頭辞「ex」に対応する名前空間「http://www.sample.net/1.0」を指定しています。また、名前空間で宣言される要素等のXMLスキーマがどこに存在するかは、schemaLocation属性を使って記述します。このschemaLocation属性では、「名前空間」と「その名前空間のXMLスキーマのファイルの場所」を指定します。この例では、「http//:www.sample.net/1.0」という名前空間のXMLスキーマファイルは「http//:www.sample.net/1.0/sample.xsd」にある、ということを示しています。複数の名前空間を使用する場合には、schemaLocation属性の値として、名前空間とファイルの所在のセットを、空白をあけて列挙します。
なお、schemaLocation属性は、名前空間 "http://www.w3.org/2001/XMLSchema-instance" に属していますので、「xsi」という別の接頭辞を付けて識別しています。
ポイント: XMLデータでは、ルート要素(一番外側の要素)の属性として、使用する接頭辞とその名前空間、また、名前空間を定義するXMLスキーマの場所を指定します。