XMLのバージョンに1.1ではなく1.0を使うべき4の理由
現在XMLにはXML 1.0とXML 1.1の二つのバージョンがある。どちらを使うべきか調査すると、XML 1.0を使うべきだとわかった。
XML 1.1ではなくXML 1.0を使うべき理由は以下の4点だ。
- XML 1.1固有の機能が必要とされる場面が極めて少ない
- XML 1.1の勧告でプログラムはXML 1.0を生成することが望ましいと記述されている
- XML 1.1はXML 1.0へ基本的に後方互換性がある
- XML 1.1の機能の一部はXML 1.0第五版にバックポートされている
XML 1.1固有の機能が必要とされる場面が極めて少ない
まず、XML 1.0と1.1の違いを調べた。このバージョン間の違いはXML 1.1(第二版)の1.3 XML 1.1での変更点とその原理的説明 Rationale and list of changes for XML 1.1に書かれている。
XML 1.1での変更点は主に要素名や属性値で使える文字の拡大である。Unicodeでまだ割り当てられていない文字も含めほとんど全ての文字を使えるようになった。XML 1.0は1998年に勧告が発表された。この当時にXML 1.0が頼っていた文字集合の定義はUnicode 2.0である。Unicode 2.0に登場しない文字でも要素の値としては使えるが、属性名などには使えなかった。
上記のXML 1.1の新機能を踏まえて、以下の記事でXML 1.1の必要性について意見が書かれている。
ここで書かれている通り、XML 1.1固有の機能が必要であったり有用である場面は限定的であり、利用頻度が極めて少ない。
XML 1.0の時点で要素名に日本語を使うことはできており、日本人であれば名前文字の拡大は特に影響がない。万が一問題があるならば、英語で表記すれば事足りてしまう。
XML 1.1の勧告でプログラムはXML 1.0を生成することが望ましいと記述されている
先ほど参照した@IT:特集:XML 1.1を分析する Page3で以下のようにXML 1.1の勧告でXML 1.0の文書を生成することが望ましいと書いてある。
XMLを生成するプログラムは、 XML 1.1特有の機能が必要とされない限り、 XML 1.0を生成する事が望ましい(SHOULD)。
Programs which generate XML SHOULD generate XML 1.0, unless one of the specific features of XML 1.1 is required.
引用: 5.1 妥当性を検証するプロセッサとしないプロセッサ Validating and Non-Validating Processors
このように、XML 1.1としてもXML 1.0の利用を推奨しているように解釈できる。
XML 1.1はXML 1.0へ基本的に後方互換性がある
XML 1.1の勧告文書で以下の記述がある。
もしある文書が整形式のXML 1.0文書、あるいは妥当なXML 1.0文書であり、なおかつ文書が[#x7F-#x9F]の範囲の制御文字を(文字エスケープを使う場合は別として)一切含まない場合、その文書は、単にバージョン番号を変える事で、それぞれ整形式のXML 1.1文書、あるいは妥当なXML 1.1文書になる事もできる。
If a document is well-formed or valid XML 1.0, and provided it does not contain any control characters in the range [#x7F-#x9F] other than as character escapes, it may be made well-formed or valid XML 1.1 respectively simply by changing the version number.
引用:2.8 プロローグと文書型宣言 Prolog and Document Type Declaration
このことから、基本的にXML 1.1はXML 1.0と後方互換性があり、XML 1.0の文書宣言において以下のようにversion="1.0"
をversion="1.1"
に変更すればよい。
<?xml version="1.0" encoding="UTF-8" ?>
<?xml version="1.1" encoding="UTF-8" ?>
XML 1.1の機能の一部はXML 1.0第五版にバックポートされている
XML 1.0はXML 1.1の勧告が発表された後にも更新されており、2008-11-26にXML 1.0第五版の勧告が発表されている。更新内容はXML 1.0第五版で以下のように書かれている。
この第五版は、XMLの新しいバージョンではない。読者の簡便の為、2006年8月16日に公開されたXML 1.0 (第四版)で報告され、集積された正誤情報(http://www.w3.org/XML/xml-V10-4e-errata)をまとめ、修正を反映したものである。特に、正誤情報[E09]に基づく修正は、要素や属性の名前における制限を緩和するものであり、これによって、これまでXML 1.1を使う事でしか得られなかった恩恵が、XML 1.0においても大多数のエンドユーザにもたらされる事となる。この結果、この仕様の以前の版に拠ると整形式でないとされてきた多くの文書でも、今では整形式となり得る。また、今回新しく許されるようになった(以前の版では許されていなかった)名前文字をID属性などに使っていた為に妥当でないとされてきた文書も、妥当となり得る。
このように、XML 1.0第五版のこの勧告ではXML 1.1の機能を一部取り込んでいる。XML 1.0第四版と第五版の違いの詳細は XML 1.0 Fourth Edition Specification Errataに書かれている。この内、XML 1.1の機能を取り込んでいるのは利用可能文字集合の拡大である(参照:はE09 – XML 1.0 Fourth Edition Specification Errata)。
Names and Tokensで定義される文字集合の範囲が第五版で大幅に拡張された。以下に第四版と第五版のNames and Tokensの定義部分を記載する。
XML 1.0 第四版(
Name and Tokens – Extensible Markup Language (XML) 1.0 (Fourth Edition))
Names and Tokens [4] NameChar ::= Letter | Digit | '.' | '-' | '_' | ':' | CombiningChar | Extender [5] Name ::= (Letter | '_' | ':') (NameChar)* [6] Names ::= Name (#x20 Name)* [7] Nmtoken ::= (NameChar)+ [8] Nmtokens ::= Nmtoken (#x20 Nmtoken)*
XML 1.0 第五版(Name and Tokens – Extensible Markup Language (XML) 1.0 (第五版))
Names and Tokens [4] NameStartChar ::= ":" | [A-Z] | "_" | [a-z] | [#xC0-#xD6] | [#xD8-#xF6] | [#xF8-#x2FF] | [#x370-#x37D] | [#x37F-#x1FFF] | [#x200C-#x200D] | [#x2070-#x218F] | [#x2C00-#x2FEF] | [#x3001-#xD7FF] | [#xF900-#xFDCF] | [#xFDF0-#xFFFD] | [#x10000-#xEFFFF] [4a] NameChar ::= NameStartChar | "-" | "." | [0-9] | #xB7 | [#x0300-#x036F] | [#x203F-#x2040] [5] Name ::= NameStartChar ( NameChar )* [6] Names ::= Name ( #x20 Name )* [7] Nmtoken ::= ( NameChar )+ [8] Nmtokens ::= Nmtoken ( #x20 Nmtoken )*
このようにXML 1.0第五版から、XML 1.0はXML 1.1で利用可能文字も扱えるようになっており、XML 1.1の利点がより小さくなっている。
まとめ
以上で示したとおり、XML 1.1の機能が必要な場面はほとんどなく、XML1.0第五版によりXML 1.0で十分な場面がほとんどである。そのため、XMLを書いたり、データとして出力する場合はXML 1.0を使うべきであり、どうしても必要な場面に限ってだけXML 1.1を使うべきだ。