2006年08月20日

XMLの「本当のメリット」ってなに?

この記事は一応は「XMLのプロ」による記事なのだと思うのだが、それで改めてメリットを紹介するのに、この程度のメリットしか出てこないというのはどういうことなんだか。
 では私が答えよう。
 私は6つの言語(C++、Java、VBA、Python、JavaScript、C#)でXMLを触ったことがある。サンプル程度ならもっと増えるが、実用的なものを書いたのは上の6つだけだ。まともにプログラミングなどしたこともない糞コンサルの皆様は、今日のエントリをコピペしておくといいだろう。

 
 まずは弱点から。
1. パースが遅い
 構造的な区切りを探すために1文字ずつ文字をチェックする必要があるので遅い。XMLを使うという観点からは、ここが一番のボトルネックになる。
2. データの格納形式を規格の基盤にしている
 RDBMSが内部でどのようにデータを格納しているかは、RDBMSの実装の詳細であり、RDBMS開発者以外は知らなくていいようになっている。RDBMSを使うプログラマが知るべきことは、リレーショナルなデータ構造モデルであり、SQLというAPIである。
 しかしXMLは違う。XMLの規格は格納形式を基盤にしている。これはXMLという技術全体の大きな足かせになっている。たとえば、XMLのバイナリ表現にはいまだにこれといったデファクトスタンダードがない。データ構造モデルやAPIではなく格納形式を基盤にしているせいだ。
 
 XMLの利点は以下のとおり。
1. 相互運用性
 これは具体的には以下の要素で構成されている。
・標準化された堅牢なパーサがどんな環境にも存在する
 ふざけたパーサも稀に存在するが。たとえばPython。
・標準化されたスキーマが存在し、バリデーションをかけることができる
 異常なデータと正常なデータをすっきりと切り分けることができる。なお言うまでもないが、相互運用性を求めるようなケースでは、「XMLフラグメント」のような糞データは論外だ。
・エンコーディングの問題に悩むことが少ない
 日本人にとっては切実だ。
・多くの人がXMLのことを多少なりとも知っている
 相互運用性にとって学習コストは無視できない。
2. 可読性
 パースの実行速度、パーサの書きやすさ、規格のコンパクトさ、こういったものを完全に捨てて、可読性だけを高めている。
 実行速度については上で弱点として述べたが、あとの2つは弱点ではない。XMLパーサを自分で書くことはないし、XMLの規格を自分で書くこともない。
3. 生態系の豊かさ
 XMLの生態系の全体を述べることは誰にもできないので、頂点だけをご紹介する。XMLSpyというXMLエディタだ。XMLSpyを知らない人は、XMLについてまだなにも知らない。
 
 逆にいえば、上のような利点を必要としないのなら、そもそもXMLの出番ではない。たとえば、RDBMSのデータの内部表現にXMLを使うような気違いはいないだろう。
 が、同じRDBMSのデータでも、テスト用データを格納するファイルとなると、XMLが適している。テスト用データを調べたり修正したりするときに、XMLの可読性やツールの存在が重要になる。

Posted by hajime at 2006年08月20日 22:55
Comments

こんちは。XMLの利点はとても参考になりますね。

ところで、ちょっと気になったのは

「RDBMSを使うプログラマが知るべきことは、リレーショナルなデータ構造モデルであり、SQLというAPIである。」

とありますが、XMLを使うプログラマは、XMLツリー構造とSAXやDOMというAPIを知っていれば十分なのではないでしょうか。そうするとRDBMSと比べて劣っているわけでもないような。

それともここの主眼は「XMLのバイナリ表現」を実現しづらいということでしょうか。

Posted by: NI-Lab. at 2006年08月22日 09:43

DOMはXMLの格納形式を完全には抽象化できていません。
たとえばコメント内容では、先頭と末尾のハイフンは禁止されていますし、ハイフンを連続させることも禁止です。DOMはこういうデータをマーシャライズしたりはしてくれません。単に禁止されています。この制限は、XMLの規格、つまり格納形式の都合に由来するものです。
この例はあまりに重箱の隅と思えるかもしれませんが、私はこの問題で半日を潰しました。この例に行き当たる人は少数でしょうが、これに似た問題はおそらく無数にあるでしょう。

Posted by: 中里一 at 2006年08月22日 22:30

コメント内容というと <!-- こういうの -->ですよね。

コメントは XML の格納形式の問題とはちょっと違うかなと思います。
コメントって、XML文書が表現したいデータ自体ではなくて、人がXMLを直接に見るときのヒントみたいなものですよね? 機械処理するときは無視するものだと思っているのですが。

DOM API でコメントを読む必要ってあるんでしょうか? っていうか DOM にコメントを処理する機能があるんですね……

Posted by: NI-Lab. at 2006年08月25日 08:12

DOMは、抽象的なデータ構造を表現したものではなく、あくまでXMLありきのAPIです。
もしDOMが、データ構造とシリアライズを別の層に切り分けたAPIだったら、おそらくコメントに関する機能はシリアライズ層に置かれていたでしょう。
現実には、DOMはデータ構造とシリアライズを切り分けていません。そもそもXMLが、データ構造とシリアライズを切り分けることのできないような性質を備えています。
 
「コメント内容は無視で」という具合にいける場合のほうが圧倒的に多いのですが、必ずどこかの重箱の隅で、ひっかかるようにできています。XMLのバイナリ表現が挫折しているのは、それが理由です。
 
あと、コメント内容を読むときには、コメント内容の制約につまづくことはありません。エラーが出るのは、書くときです。

Posted by: 中里一 at 2006年08月26日 02:07