改めてXMLを考える
「<」「&」で始まらないマークアップ
2003年12月号掲載記事
皆様こんにちは。インフォテリアの木村です。
XML 1.0の2.4節では、文字データとマークアップについてまとめられています。マークアップの代表としては開始タグ(<・・>)、終了タグ(</・・>)、実体参照(&・・;)などが挙げられ、ほとんどのマークアップの最初の文字は「<」か「&」の記号で始まります。ところがそうでないマークアップが2種類あり、そのうちのひとつが、「文書要素(ルート要素)の外にあり、他のマークアップに含まれない空白」です。
これがマークアップ??と思ってしまいますが、これはXML 1.0の初版では言及されてなかったのですが、第二版(Second Edition)にて明記されたものです。第二版に反映されたErrata(正誤表)の中では次のような理由が明記されています。「この空白はSAXで報告されず、DOMで扱われず、またInfosetにおいても除外されるため、これをマークアップとして明確化する」。これにより、「マークアップでないすべてのテキストは文書の文字データを構成する」の定義が一層明確化されました。第二版は初版のErrataを仕様書に反映したものですが、その過程の中で、SAXやDOMやInfosetが考慮され、そして協調されている点は見逃せません。
そして現在では、XML 1.0の第二版のErrataを仕様書に反映する第三版(Third Edition)がProposed Edited Recommendationの段階で、こちらももうすぐ勧告になりそうです。仕様書を確認する際に、それがErrataで修正されているということがたまにあり、念を入れるにはErrataまで調べる必要がありますので、それらErrataの内容が正式な版の中にまとめられることは利用者にとって非常に便利なことです。
そして次に、「<」または「&」の記号で始まらないマークアップのもうひとつとして「CDATAセクションの終了を示す「]]>」文字列」があります。
ところで文字データとして「]]>」文字列を記述するにはどうすればよいかなんて考えたことはあります?CDATAセクションの中で「]]>」を記述してしまうと、それはCDATAセクションの終了となりますので、文字データにはなりません。では、<data> ]]> </data>と記述するのはどうでしょうか。実は同じく2.4節において、「(SGML互換のために)CDATAセクションの終了でない「]]>」文字列は、「>」記号を「&gt;」または文字参照によってエスケープしなくてはならない」と定められています。従ってエスケープの方法として定義済み実体参照を使うならば、<data> ]]&gt; </data>と記述されます。
ここに、「>」記号の定義済み実体があらかじめ用意されている必然性があります。そしてマークアップの開始デリミタをエスケープするための「<」と「&」記号と、属性の引用符記号を属性値内でエスケープするための「"」と「'」記号の定義済み実体も必要とされ、従ってこれら5つの定義済み実体があらかじめ用意されています。これらの5つの定義済み実体は、このような状況で必要とされるものであり、"伊達"に定義されているわけではありません。
(注)一部システムでの文字化けを避けるため、コラム内の「&」「<」「>」は全角表示とさせていただいております。