XMLのカタチXMLを学ぼう(2)(1/2 ページ)

前回は、XMLが言語を記述するためのメタ言語である、ということを簡潔に示した。それゆえに、XMLは非常に幅広い領域に応用可能だということを理解していただいた。今回は、XMLによってどのように情報が表現されるのか、その構造と、XML自身が持つ枠組みについて説明する。

» 2000年06月22日 00時00分 公開
[川俣晶株式会社ピーデー]

マークアップすること

 XMLによって作られた言語によって作成されるファイルを、「XML文書」と呼ぶ。コンピュータ上に記述する情報を、データとプログラムの2つに大分類したとき、XML文書に記述するのは、主にデータである。データとは要するにプログラム以外の大半の情報が該当すると思ってよいだろう。その中には、RDBで扱うようなデータもあれば、電子出版用の書籍のような文書もある。

 なかには、XMLを使ってプログラム言語を作ってしまうという試みもあるので、XMLの構文でプログラムを書くというケースがないこともない。だが、CやBASICのような既存のプログラム言語の利用環境がたいへん強力なため、積極的にプログラムをXMLでやろうという動きは見られない。

 つまり、XMLは、データを記述する手段を提供するために使われることが多い(前回説明したとおり、XMLはメタ言語なので、正確に言えば、XMLでデータを記述する言語を作ることが多い、となる)。

 だが、どんなデータでもXMLで自由に記述できるわけではない。

■すべての情報を文字で表現する

 XMLはマークアップ言語であると言われる。マークアップとは、文字列の中に、特定の機能を持った文字を使って意味や機能を書き込むことを意味する。例えば、以下のような文字列があるとする。

今日の夕飯はカレーだ。

 例えばHTMLを用いて、カレーを強調したいと思った場合、「<strong>」と「</strong>」という文字を挿入することで、それを表現する。

今日の夕飯は<strong>カレー</strong>だ。

 これが、マークアップするということである。

 ここで重要なことは、本文の文字と、機能を示す記号が、同じ種類の文字によって書かれているということである。もちろん、機能を示すために使われる文字は、本文の文字として使うことはできない。別のマークアップ表記に置き換えて書かねばならないのだが、それを含めて考えても、マークアップ言語で書かれた文書には、通常の文字しか含まれないと言うことができる。

 つまり、これがXMLの大きな特徴の1つなのである。

 XMLはどんな情報もすべて文字に置き換えて表現しているのである。

 RDBやC言語のようなプログラム言語の場合、文字は文字、数値が数値、といった形で、別個に管理、処理されるようにできている。文字は文字コードに置き換えて記憶し、数値は人間には読みにくい2進数の情報として記憶するようになっている。XMLには、そのような区別は存在しない。

 しかし、XMLが文字以外のデータの扱いを拒絶している、と言うわけではない。実際に、XMLで数値を扱うことも多い。つまり、数値もいちど文字に置き換えて表現すれば、問題ない、ということなのである。そのためには、人間には読みにくい2進数の情報を直接記憶する代わりに、“1234”といった文字で書かれた数値を、文字として記録するのである。

 その事実は、いくつかのメリットとデメリットをもたらしてくれる。まずはメリットを列挙してみよう。

■XMLのメリット

  • XML文書を処理するプログラムの構造が簡単になる
  • テキストファイルを扱う既存の多くのツールで容易に扱える
  • 人間が直接内容をチェックするのも容易
  • 内容の修正も簡単 テキストエディタがあれば誰でも修正できる

 それに対してデメリットとしては、こういうものがあげられる。

■XMLのデメリット

  • 文字として表現すると回りくどくなり、データ量が増える
  • 文字列以外はいちいち文字列から変換してから処理することになるので、処理が重くなる
  • 文字で表現しにくい画像データなどの扱いは不得手

 ひとくちでマークアップ言語を用いるメリットとデメリットを要約すると、メリットは分かりやすさの向上であり、デメリットは効率の低下と言える。

 この事実から、XMLについてのひとつの傾向が浮かび上がってくる。

 それは、コンピュータの処理能力に余裕があるいまだからこそ、使える技術だということだ。10年以上前には、コンピュータの処理能力にそれほど余裕はなく、効率の向上のために、限界領域のぎりぎりのところで、システムが開発されていた。例えば、2000年問題として有名になった本来4桁の年号を2桁で表記するというような手法が、有益なテクニックとして持てはやされていた時代は本当に存在していたのである。データは1ビットでも圧縮して詰め込むことが正義として認められていたのである。また、そこまで効率を追求しなければ、システムを稼働させられなかったというのも事実なのである。

 しかし、激烈な競争によって、コンピュータの性能向上と価格低下には著しいものがある。1ビットを削るような極限状況の効率向上をしなくても、それなりの性能を発揮できる時代がきたと言える。それと同時に、パソコンの大衆化などによって、より分かりやすい技術に対する要求が高まってきた。一部の天才的職人に依存してはニーズを満たせないほど、コンピュータの利用が増加したと言うことである。

 XMLは、そういう時代の背景にぴったり適合する技術として登場したと言える。それが、XMLを注目される人気技術に押し上げるひとつの要因になっているのは間違いないだろう。

XML文書は構造を持つ

 結局XMLって何なのよ、という問いに答えるのは難しい。前回説明したように、XMLはメタ言語であるため、さまざまな言語を作り出すために利用できる。その可能性のすべてを網羅して説明するのは絶望的に難しい。それほど多様な可能性が存在するのである。

 だが、逆の方向から考えて、XMLで表現できる限界というものを解説することは可能だ。XMLはメタ言語として新しい言語を生み出す道具として使用できるが、どんな言語でも生み出せるわけではない。XML自身が、生み出す言語の表現力の限界を決める枠組みとして機能するからだ。

 もしかしたら、メタ言語が、自分の生み出す言語の構造に制限を付けてしまうのは、よいことではないと思うかもしれない。どんな言語でも生み出せるメタ言語がよいメタ言語とする考え方は当然あり得る。

 しかし、XMLには言語の定義を与えなくても処理できるという大きな特徴がある。そういう処理を実現するためには、何でもありということでは処理ができなくなってしまう。そのため、XML自身が、表現力に制限を設けることは、当然の欲求と言えるのである。

■XML文書の構成要素

 さて、それではXML自身がすべてのXML文書に課す構造というのは、どんなものだろうか。まず、XML文書が持つことができる構成要素は、以下の通りだ。

  • 文字列
  • 要素(Element)
  • 属性(Attribute)
  • 処理命令(Processing Instruction)

■文字列

 文字列とは、文字通り、文字が並んだものだ。

■要素

 要素とは、開始タグから終了タグまでの範囲を意味する。タグとは<と>で名前を囲んだものだ。例えば、以下の例でいうと、<strong>はタグであり、<strong>〜</strong>は要素である。

今日の夕飯は<strong>カレー</strong>だ。

 ここでは便宜上HTMLのタグ名を用いて説明を進めているが、もちろん、実際に使うときは、使用する言語が定めたタグ名を書き込んで使うことになる。

■属性

 属性とは、開始タグ内に記述される補助的な情報だ。以下の例で言うと、src="https://image.itmedia.co.jp/ait/articles/0006/22/curry.jpg"が属性である。

<img src="https://image.itmedia.co.jp/ait/articles/0006/22/curry.jpg" />

■処理命令

 処理命令というのは、特定のXMLアプリケーションソフトへの指示を埋め込むために使用されるもので、<?で始まり、?>で終わるものだ。だが、あまり使用頻度が高くないので、ここでは便宜上無いものとして説明を進めよう。

■要素の親子関係

 さて、XMLでは要素の中に要素を書くことができる。

<h1>今日の夕飯は<strong>カレー</strong>だ。</h1>

 この例では、h1要素の内側にstrong要素があると言える。だが、という言い方はあまり便利ではないので、通常は、、という用語を使って表現する。親子関係の用語には、祖先、子孫、孫などの便利な用語がたくさんあり、構造が複雑化したときに説明しやすいからだ。

 つまり、この例では、h1要素の子がstrong要素であり、strong要素の親がh1要素であると言う。

 要素の内部にある文字列や、開始タグ内に書かれた属性も、便宜上親子関係で表現する。例えば、以下の例であれば、文字列のカレーstrong要素の子であり、strong要素は文字列のカレーの親である、と言える。

今日の夕飯は<strong>カレー</strong>だ。

 また、以下の例であれば、src属性はimg要素の子であり、img要素はsrc属性の親であると言える。

<img src="https://image.itmedia.co.jp/ait/articles/0006/22/curry.jpg" />

親子関係は木になる

 このような感じで、どんなXML文書であっても、すべての構成要素を親子関係として表現することができる。

家系図として書き表したXML文書 家系図として書き表したXML文書

 この家系図には、結婚というイベントがないので、親から子へ、一方方向に親子関係の流れができあがる。つまり、家系図の誰からたどっても、必ず共通の祖先にたどり着き、全員の共通の祖先は必ず1つになるのである。

■木構造

 このような構造を、別の言い方では、木構造と呼ぶ。1つの幹から、枝分かれしながら、上に広がっていくようすを表現したものである。

樹木に見立てる 樹木に見立てる

 さて、結論を言うと、XMLとは、要素、属性、文字列などを木構造に配列することを許しており、木構造からはみ出すデータを記述することに使用することはできない。DTDやスキーマと言った手段(この連載でいずれ詳しく取り上げる)を用いると、構造を規定することができるが、木構造をさらに制限することができるだけで、木構造から外れたデータ構造を定義することはできない。

 例えば、2つの親を持つ要素を定義したい、使いたい、といったニーズが存在する場合は、XMLを利用することができない。木構造は、一本の枝が、複数の幹につながるような形は許さないからだ。別の言い方をすれば、複数の子を持つことは許されるが、親は一人しか持つことが許されないのが木構造と言える。

 しかし、これはXML自身が持っている制約でしかない。HTMLのリンク機能のように、ハイパーリンクを併用することで、木構造とは関係なく、どこからどこへでも、情報の関連性を設定することができる。ハイパーリンクの機能をXML上で利用することは可能だ。そのためには、XLinkやXPointerといったリンク用の言語の制定作業が進んでいる。しかし、ハイパーリンクが使用できるのは、それらの言語を併用すると明示的に指定した場合に限られる。それに該当しないXML文書は、(他のリンクメカニズムを参照していないかぎり)、木構造に制約されるのである。

 ハイパーリンクに関しては、いずれ機会を見て取り上げたいと考えている。

       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。