XML宣言


SGMLにはSGML宣言というものがありましたけど、XMLにもXML宣言 というものがあります。これはとりあえず書かないと行けないものです。 但し、こちらは、SGML宣言とは全くことなり、

この文書はXMLの文書だ!

と、文字通り「宣言」するためのもの(言い過ぎかな、)です。こんな書き方するそうです。

<?xml version="1.0"?>

一見して分かるように、SGML宣言のような様々な定義はありませんというか、なくてもいい。
でも、厳密には、こう定義されてます。

XML宣言 は '<?xml' VersionInfo EncodingDecl? SDDecl? S? '?>' と書く
S は空白(OX20,0x0a,0x0d,0x09)ね。

先頭の <?と最後の?>とは 処理命令(の開始、終了)だということで、終了の方はともかく、まぁ、いわゆるSGMLで よく使われる方法ですよね。
#PIの定義で、<? で始まり、?> で終わる と定義されちゃってる。理由は、、、?

それにxmlが続いて、「XMLの文書」と 宣言するわけなんですが、VersionInfoが必須になってます。
これは、「XMLのバージョンを明記しろ」ということで、現行は1.0 なので、

VersionInfo := S 'version' Eq ( 'VersionNum' | " VersionNum ")
(Eq ってのは = のこと。厳密には、その前後に0〜1個の空白が入っていい)

っていう書式にしたがってversion="1.0"って書きます。
このあたりまでは、いわゆるSGML宣言の先頭に<!SGML・・・・> で、必要に応じて(ENR)(バージョンにあたるでしょ?)を記載するの と同じようなもんかも知れませんね、、、

これだけなら何てことないんですけど、

EncodingDecl?

これが曲者。ここで文書のエンコード方法を記載するんです。そういう意味では、 XML宣言は SGML宣言に似ていなくもない。でも、いちいち文字のマッピングなんか書かない。
で、?が付いてるから、別に書かなくてもいい。でも、ここで特になにもいわないと「異議無き時は沈黙を持って答えよ」じゃないけど、 ISO 10646というか、同じじゃないけど Unicode 2.0だかなんだかになっちゃう。
#UTF-8だっけなんだっけ、、、全然わからん。

私の場合、ここにencoding="EUC-JP"って書く。 書式は、

EncodingDecl ::= S 'encodeing' Eq ('"' EncName '"' | "'" EncName "'")

個人的に、XMLで一番わかんないのが、このエンコードに関する話。 勉強したら、書いてみます。

で、そのあとの

SDDecl?

スタンドアロン文書宣言(Standalone Document Declaration)のことだそうで、、、 これもEncodeingDecl同様、別の機会にということで、勘弁。

というわけで、結論。
こんな感じで「決まり文句」として使いましょう。(^ ^;

<?xml version="1.0" encoding="EUC-JP" ?>

<?xml version="1.0" encoding="ISO-2022-JP" ?>
パソコンでお仕事してる人は、
<?xml version="1.0" encoding="Shift_JIS" ?>
かな、、、

そうそう、大文字・小文字の違いに気を付けてくだせぇ。


miuraj@isc.meiji.ac.jp