前回の講座では,XMLが統一的なデータ格納形式であり,インターネットと相性がよいことを説明しました。今回はXML文書を記述するときの書式を説明します。XML文書はテキスト・ファイルです。Windowsの「メモ帳」などのテキスト・エディタさえあれば,XML文書を作成できます。XML文書はW3Cで取り決められたXMLの書式にしたがって記述しなければなりません。ただし,この書式はそれほど難しいものではありません。
●XML文書の構成
図1●XML文書は,XML宣言とXMLインスタンスで構成される |
現在のXMLのバージョンは,1.0です。したがって,XML宣言で<?xml の後には,version="1.0"と記述することになります。文字コードには,いくつかの種類が指定でき,encoding="Shift_JIS",encoding="Unicode",encoding="ISO-2022-JP"(JISコードを表す),encoding="UTF-8",及びencoding="UTF-16"のように表します。もちろん,指定した文字コードでXML文書を保存しなければなりません。Windows 2000/NTのメモ帳では,ファイルの保存形式にいくつかの文字コードを指定できますが,Windows 95/98/Meのメモ帳では,自動的にシフトJISで保存されるので注意してください。したがって,Windows 95/98/Meのメモ帳で作成するXML文書のXML宣言は,必ず<?xml version="1.0" encoding="Shift_JIS"?>となります。
●XMLのタグは任意に定義する
HTMLでは,あらかじめタグが定義されていて,タグの種類によって機能が決まっていました。しかしXMLでは,XML文書の作成者が任意のタグを定義することになります。タグで囲まれるコンテントの内容に応じて,<と>の中に記述する文字列(これを要素名と呼ぶ)を決めます。図1のXML文書では,<all-data>,<company>,<name>,<address>,および<employee>という5種類のタグを使っていますが,これらは筆者が定義したタグです。XMLのXは,eXtensible(拡張可能)を表しています。タグを任意に定義できることが,すなわち拡張可能というわけです。
HTMLでは,タグの大文字と小文字が区別されず,例えば,<BODY>と<body>は同じタグであるとみなされます。XMLでは,大文字と小文字が区別されるので,<company>と<COMPANY>は,異なるタグであるとみなされます。開始タグ,コンテント,及び終了タグは,1行で記述しても,それぞれを異なる行に分けて記述してもかまいません。
・開始タグ,コンテント,終了タグを1行で記述した例
<name>日経BP社</name>
・開始タグ,コンテント,終了タグを異なる行に分けて記述した例
<name>
日経BP社
</name>
タグの配置方法には,2つのルールがあります。1つは,XMLインスタンス全体を囲むタグ(ルートとなるタグ,ルート要素)が1つだけ必要だということです。もう1つは,開始タグと終了タグが交差している部分があってはならないということです。図1のXML文書では,XMLインスタンス全体が<all-data>というタグで囲まれていました。もしも,<all-data>と</all-data>の部分を削除すると,正しいXML文書となりません。
図2●開始タグと終了タグが交差する部分があってはならない |
これらのルールは,タグの構造を階層化して整然と表すことを目的としたものです。決して難しいルールではないはずです。ルールにしたがって記述された正しいXML文書のことをwell-formed XML(整形式XML文書)と呼びます。
タグにネームスペース(name space:名前空間)を設定することもできます。インターネットのような世界レベルの環境では,同じタグに異なる意味合いを付けてXML文書を作成している人が存在する可能性が高くなります。このようなXML文書を混在させて使用すると,タグがバッティング(衝突)してしまいます。これを防ぐ仕組みがネームスペースです。ネームスペースは,タグの中に「xmlns="ネームスペース名"」という書式で設定します。ネームスペース名には,企業のURLなどのようにユニークな名前を指定します。
・ネームスペースを指定したタグの例
<company xmlns="http://www.nikkeibp.co.jp">
日経BP社
</company>
●コンテントを持たないタグ
開始タグの中に,「属性名="属性値"」という書式で,属性を挿入することもできます。ネームスペースも属性として設定されるものです。複数の属性を設定する場合は,「属性名="属性値"」のセットをスペースで区切ります。例えば次の書式は,<company>タグの内側にあった<name>,<address>,および<employee>という3つのタグを<company>タグの中の属性としたものです。このようにすると,<company>と</company>で囲まれたコンテントは空になってしまいます。ちょっと無駄な感じがしますね。
・開始タグの中に属性を設定した例
<company name="日経BP社" address="東京都千代田区" employee="1000">
</company>
下に示したように,コンテントが空の場合に限り,終了タグを省略することが可能です(省略しなくてもかまいません)。この場合には,開始タグの末尾を/>とします。この表現は,データベースのテーブルをXMLで表す場合に便利です。見た目にわかりやすくなるからです。
・終了タグを省略した例
<company name="日経BP社" address="東京都千代田区" employee="1000" />
<company name="(株)ヤザワ" address="栃木県足利市" employee="5" />
●DTD
XML文書では,XML宣言とXMLインスタンスの間にDTD(Document Type Definition,文書型定義)を記述することがあります。DTDは,XML文書の構造を定義するものです。Webブラウザなどが装備しているXMLパーサー(XMLパーサーに関しては,次回の講座で詳しく説明します)という機能が,DTDとXMLインスタンスを比べることで,XML文書が妥当なものであるかどうかを検証します。
図3●XML文書の中にDTDを直接記述した例 |
DTDは,XML文書の設計図のようなものです。XMLインスタンスを記述してからDTDを定義するのではなく,DTDの定義に基づいてXMLインスタンスを記述することになります。XMLパーサーは,DTDとXMLインスタンスを比べることで,XML文書の書式が正しいことだけではなく,XML文書のファイルが壊れていないことも検証できます。
DTDは,XMLやHTMLのベースとなっているマークアップ言語であるSGML(Standard Generated Markup Language)では,必須のものとなっています。それが,そのままXMLにも流用されているのです。DTDは複雑で理解しにくいものかもしれません。そこで,DTDに代わるXMLの文書型定義の書式として,XML SchemaやRELAXなどが考案されていますが,どちらも正式なW3C勧告とはなっていません。
現実問題として,エンドユーザーが,テキスト・エディタを使ってコツコツとXML文書を作成する必要などないでしょう。皆さんが使用しているアプリケーションが,XML文書としてデータを保存してくれたり,XML文書を読み込んでくれるはずだからです(まだまだXMLに対応していないアプリケーションも数多くあります)。だたし,XMLを理解するためには,一度だけでもかまいませんから,テキスト・エディタでXML文書を作ってみることをお勧めします。
次回は,XMLパーサーとDOMを説明します。お楽しみに!
◎IT Pro注:関連記事/ページ
■書籍「これから始める人のXMLガイド」のページ(IT Proに掲載のXML関連コンテンツへのリンク含む)