XML 文書

Revised: Oct./05th/2003

XMLとはなんだろうか

XML仕様W3C (World Wide Consortium)という標準化団体によって勧告された仕様(Recommendation)です。最初の仕様はXML 1.0として1998年に勧告され、2000年には既知のバグを取ったXML 1.0第二版が勧告されています。いずれにしても、十分な実績のある安定的な仕様だと言うことができます。

XML自身は、テキストの記述方法を規定したものであり、XML仕様に従って文書の型(スキーマ)を設計された文書のことをXML文書と呼んでいます。W3Cが策定した文書型には、HTML文書をXML文書として設計しなおしたXHTMLや、数学記号をサポートしたMathXMLのほか、XML文書の文書型を記述するためのXML Schema、XML文書のスタイルを記述するXSL/XSLTなど沢山のものが挙げられます。W3C以外でも、通信/出版などの業界では、各々の分野で独自に文書型を設計/公開し、実際に利用されています。

XMLの現状

XML (Extensible Markup Language)は登場の当初、HTMLの後継規格だと認識されることがありました。これはまったくの誤解で、XMLは設計段階からSGML (Standard Generalized Markup Language)の後継として、汎用的なデータ記述のための仕様として策定されました。

不遇な登場初期を経てひと段落すると、XMLはJavaとの相性の良さを指摘されるようになります。その理由は二点あります。まず、最も基本的なフォーマットであるテキストファイルであること、そして、UNICODEをサポートするということです。"Write Once, Run Anywhere"であるポータブルなコードのJavaと、環境を問わないポータブルなデータ形式であるXMLを組み合わせれば、面白いアプリケーションが実装できるはずだと思われていました。

実際、XML関連の規格は精力的に策定され、膨大な数に上ります。また、近年のWeb ServiceはXMLベースのシステムです。現時点で現実的に使われている例では、プロダクトの構成ファイル、他システムとやり取りするデータの中間形式、フルセットのDBMSを実装できない環境でのデータ形式、それとWeb Serviceが挙げられます。特に構成ファイルや通信データの形式としては、現状では理想的な仕組みだと言えます。というのも、XML文書は、単なるテキストファイルや固定長、CSVに比べるときわめて扱いやすく、簡単に複雑なデータ構造を記述できるためです。

一方、難点としては、テキストファイルであるため、注意深く設計されたバイナリファイルに比べると、サイズが大きく、パフォーマンスが悪くなることが挙げられます。しかし、バイナリー形式のデータ構造を扱う処理系は一般に高価であり、習得労力も高くなるため、よほど普及しているか、確実な要件があるかでないと、実際には採用しづらい傾向にあります。サイズという観点では、CSVや固定長テキストファイルと比べても何倍かにはなるでしょうから、XMLは決して効率の良いデータ形式ではありません。しかし、扱いやすいこと、実績のある処理系が多くあること、注目されていることなどの観点から、システム/アプリケーション開発で必須の要素技術であると言えます。

しかし、業界や分野によっては、未だに実装例が少なく、扱う機会のない方々も多くいらっしゃるでしょう。関連仕様があまりに多すぎて、手をこまねいている方もいらっしゃると思います。本稿では、XMLの現状を振り返って、新たに参入する敷居を低くすることが目的です。

整形式と妥当

XML仕様に従うためには、いくつかの制約に従う必要があります。代表的な制約として、整形式であること(well-formedness)と、妥当であること(validity)の二つが挙げられます。

XML 文書の実例

本稿では、XML 1.0仕様の詳細を紹介することが目的ではありませんが、基本的な概念については最初に紹介しておきます。詳細は、仕様書を確認してください。整形式の例を示すために、簡単なXML文書の例をリスト1に挙げます。

リスト1. 整形式のXML文書の例(demo.xml)

<?xml version="1.0" encoding="UTF-8"?>
<address>
    <item sex="male" custid="E21099">
        <name>菅井 学</name>
        <access kind="email"></access>
        <access kind="url">http://www.nextindex.net/java/</access>
        <image file="msugai.png" />
    </item>
    <item sex="male" custid="E27989">
        <name>鈴木 竜広</name>
        <access kind="email">tsuzuki@hoge.foo.bar</access>
        <image file="tsuzuki.png" />
    </item>
    <item sex="female" custid="E29435">
        <name>栃原 宏枝</name>
        <access kind="tel">090-xxxx-xxxx</access>
        <image file="tochi.png" />
    </item>
</address>

リスト1をテキスト・エディタに貼り付けて、文字コードをUTF-8で保存してください。Windows XPの場合は、、「メモ帳」でUTF-8の文書が保存可能です。他の文字コードで保存する場合は、最初の行の属性encodingの値を、適切なものに書き換えてください。

MS I.E.には、XMLプロセッサ(パーサ)が搭載されているので、XML文書の解析結果を表示することができます。リスト1を保存した"demo1.xml"をダブル・クリックすると、デフォルトではMS I.E.に関連付けられているので、MS I.E.が起動してブラウズできます。

MS I.E. 6.0での表示例
図:MS I.E. 6.0でのXML文書の表示例

整形式(well-formedness)

XML文書は各々がスキーマを持っています。スキーマはDTDやXML Schemaなどの複数の仕様で記述することが可能ですが、明示的に記述しないことも許されています。明示的にスキーマを持たない場合でも、XMLの仕様に従わないと、XML文書とは呼べませんし、XML対応の処理系による処理でエラーとなる可能性があります。最低限度、XML文書であるために必要な制約が整形式であることになります。

逆に言うと、XML 1.0仕様の全てに照らして誤りの無い文書を、整形式のXML文書(Well-Formed XML Documents)と呼ぶことになります。XML仕様では、利用可能な文字種(許される文字セットに含まれる文字の種類)、引用符の種類、要素名/属性名の規則(予約語の有無と種類)、実体参照、空白類文字の取り扱いなど、くさい部分がたくさんあるのですが、ここでは、代表的な整形式の条件を紹介します。

リスト1はXML文書の実例です。タグによって要素が記述されており、HTMLに似通っています。しかし、SGMLをベースに定義されているHTMLとは、許される規則について、大きな違いがあります。

XML宣言

XML文書の一行目はXML宣言です。次は、文字コードをJIS (ISO-2022-JP)で保存したXML文書のXML宣言の一つです。

<?xml version="1.0" encoding="iso-2022-jp"?>

従うXML仕様のバージョン、文字コード、スキーマ記述の参照の有無などを、属性として指定できます。XML宣言は必須ではありませんが、あったほうが良いでしょう。記述する場合は、version属性が必須です。現在勧告されているバージョンは1.0のみなので、version="1.0"しか記述できません。リスト1のencoding属性は任意ですが、UTF-8, UTF-16以外の文字コードを使う場合は指定が必須だと言えます。UTF-8/UTF-16の場合も記述したほうが、間違いがなくてよいでしょう。

要素

開始タグから終了タグまでが要素であり、開始タグと終了タグの間が要素の内容になります。

<!--要素-->
<要素タイプ>	<!--開始タグ-->
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
</要素タイプ>	<!--終了タグ-->

一般に、開始タグは必ず終了タグで閉じられている必要があります。他の要素とは完全な入れ子関係になっている必要があり、二つの要素の開始タグと終了タグが、たがいちがいになっていることは許されません。HTMLでは、一部の要素で構造上誤解が生じないときに限り、終了タグの省略が許されていましたが、XMLでは許されません。

<親要素タイプ>
    親要素の内容・・・・・・
    <自分自身要素タイプ>
        自分自身の内容・・・・・・
        <子要素タイプ>子要素の内容・・・・・・</子要素タイプ>
        <子要素タイプ>
            子要素の内容・・・・・・
            <孫要素タイプ>孫要素の内容・・・・・・</孫要素タイプ>
        </子要素タイプ>
    </自分自身要素タイプ>
    <兄弟要素タイプ>兄弟の内容・・・・・・</兄弟要素タイプ>
</親要素タイプ>

リスト1では、XML宣言の次にaddress要素の開始タグが記述されています。一般に、要素は複数の子要素を持つことが可能であり、唯一つの親要素を持ちます。最上位の親要素のことを、ルート要素(またはドキュメント要素)と呼び、ルート要素は文書中で唯一つ存在し、親要素を持ちません。

属性

要素には、開始タグに属性を記述することができます。

<!--要素-->
<要素タイプ 属性名="属性の値">	<!--開始タグ-->
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
    要素の内容・・・・・・
</要素タイプ>	<!--終了タグ-->

リスト1ではitem要素にsex属性とcustid属性が指定されています。要素は任意の個数の属性を持つことが可能です。属性は、属性名="値"という形式で、当該要素の開始タグに記述します。HTMLでは、いくつかの属性では、値のみを裸で記述することが可能、引用符を省略可能、などの例外規則がありましたが、XMLでは何れも許されません。

また、要素中に同じ属性名の属性は一回のみ許されます。例えば、<access kind="tel" kind="mobile">とすれば不正です。

大文字と小文字

XML仕様では、大文字と小文字を区別します。リスト1の場合は、参照するスキーマが明示されていませんので、任意の要素/属性が記述可能ですが、XML処理系は、大文字と小文字の要素名や属性名は異なるものとして処理します。

空要素

要素は、開始タグと終了タグを持つ必要があります。しかし、内容を持たない要素(空要素)の場合は、開始タグと終了タグを一つのタグで記述できます。リスト1では、image要素が空要素に当たります。空要素は、<image ...></image>とする他に、<image ... />のように記述することが可能です。

妥当(validity)

XML文書が明示的なスキーマを持っているとき、当該スキーマに照らして正しい文書のことを妥当なXML文書であると呼びます。ローカルに利用する場合、関連当事者がスキーマを把握していれば、明示する必要がないこともあるでしょうが、直接の面識がない人々で共有する場合は、なんらかの方法で、スキーマを定義する必要があります。XMLでは任意のスキーマの文書が可能なので、なんらかの制約がないとデータの意味を伝えることができないのです。

現在主流のスキーマ記述方法がDTD (Document Type Definition)です。DTDがXMLにそぐわない点を考慮して、W3Cが2001年5月に勧告したのがXML Schemaです。他に、XML Schemaの複雑性に難色を示して2001年12月にOASISにより発行されたRELAX NGというスキーマ言語も存在します。



Copyright © 2003 SUGAI, Manabu. All Rights Reserved.
SEO [PR] !uO z[y[WJ Cu