2009-08-18

モダンなXML出力方法について

はてなブックマーク   livedoor clip

XHTML2は残念なことになってしまいましたが、HTML5にしろフィードにしろ、XML構文が重要なことにはかわりのない昨今みなさんいかがお過しですか。ずいぶんとエントリの間隔が空いてしまって申し訳ありません。

さて、XMLの出力には

  • to_xml()のようなメソッドを呼ぶ
  • RubyのBuilderのようなDSLを使う
  • テンプレートエンジンを使う
  • 手書き

などの方法が考えられますが、今回の本題はこれらの方法によって生成される最終的なXML文書(インスタンス)はどう表現されるべきか、についてです。

エンコーディングはUTF-8で

これはもう説明不要ですね。UTF-8が処理できない環境というのは本当に少くなりました。モバイルや組込み等でどうしても対応できない場合以外はUTF-8を使うのが望ましいと思います。

実体参照の件

実体参照というのはXML内で文書の一部に名前を付けて再利用する仕組です。たとえば「&」という文字(文字はXML文書を構成する最小単位です)を出力するときは、XML文書に直接記述することができないので「&amp;」とエスケープします。XML仕様では&や<など5種類の実体参照がビルトインで定義されていますが(これを定義済み実体と呼びます)、DTDを使うことで自分で好きな実体参照を定義することもできます。たとえばハートマーク(♥)を出すために「&hearts;」と書くというのはよく知られているでしょう。この「&hearts;」という実体参照はHTMLのDTDで定義されています。

HTMLのDTDで定義されている実体参照を使うためには、DOCTYPE宣言(「<!DOCTYPE」で始まるものです)でHTML/XHTMLのDTDを読み込まなければなりません。HTMLで定義されている実体参照は個別のファイルで定義されているので()、特にHTMLでない文書型を使う場合でもこれを個別に読み込めばHTMLで定義されている実体参照を使うこともできます。

しかし、モダンなXML文書ではDOCTYPE宣言を付けないものもあります。たとえばAtom仕様にはDTDがありません。仕様にDTDがないとしても、DOCTYPE宣言を付けることは可能ですが、通常のライブラリはAtomフィードを出力するときにDOCTYPE宣言を付けないのが一般的です。

このような場合にハート記号を使いたくなったらどうすればいいのでしょうか。まずはその文字を直接入力できないか考えてみましょう。ハート記号を表示するのにわざわざ実体参照を使う必然性はないのです。エンコーディングがUTF-8であれば、その文字をそのまま出力すればよいでしょう。

もし何らかの理由でどうしても直接入力したくない場合は、実体参照を使うのではなく数値文字参照を使うのがよいでしょう。たとえばハート記号は&#9829;です。

xml:baseは使わずに絶対URIを利用する

xml:base属性を使うと相対URIを解決するための基底URIを設定できるのですが、
これをきちんと解釈してくれないクライアントやライブラリがいるのも事実です。
なので、ハイパーリンクとしてURIを埋め込むときには、たとえ同じサイト上
のリンクでも絶対URI(「http://」で始まるURI)を使うのがよいでしょう。