<?xml?>

XML 宣言 (XML)

[11] XML文書実体の先頭に書くことができる <?xml?>XML 宣言 (declaration) 外部解析対象実体の先頭に書くことができる <?xml?>テキスト宣言 (text declaration) といいます。

XML 宣言

[12] XML宣言文書実体の先頭に1つだけ指定することができます。

[13] XML宣言は必須ではありません。

[15] 空白注釈も含め、テキスト宣言より前に何かがあってはいけません。 (BOM はあってもOKです。)

テキスト宣言

[6] テキスト宣言文書実体を除くすべての外部解析対象実体 (外部一般解析対象実体外部引数実体外部部分集合実体) の先頭に1つだけ指定することができます。

[14] テキスト宣言は必須ではありません。

[7] 空白注釈も含め、テキスト宣言より前に何かがあってはいけません。 (BOM はあってもOKです。)

[8] XML 文書SGML 文書である、という建前からすると、テキスト宣言SGML 処理指令の一種として解釈されることになりますが、マーク付け宣言の中の引数実体参照参照する外部引数実体テキスト宣言が含まれていると、 マーク付け宣言引数として処理指令が含まれることになって、好ましくないように思えます。

[9] 外部実体についてはリテラル実体値ではなく置換文SGML実体に相当すると解釈すれば SGML 的にはテキスト宣言は対応するものが何もない (システム側に属する何かである) ということになりますが、 そういう任意の解釈を導入してしまうと何とでも言えてしまうのでちょっと・・・。
[10] 属性値で使われる一般実体参照からは外部実体参照してはいけないことになっているので、 この問題は生じません。
[34] ここでいう「テキスト」とは、テキスト実体 (text entity) (解析対象実体) や実体文 (entity text) の「text」 の意味 (= 「parsed」) と思われます。

擬似属性

[16] XML宣言テキスト宣言には、属性のように見える引数を指定することができます。 これは要素に指定される属性とは違った専用の構文を持っています。属性の順序が固定である、 特定の属性値しか使えず、実体参照も認められないなどの違いがあります。

[17] これらは擬似属性と呼ばれることがあります。ただし「擬似属性」という用語は <?xml-stylesheet?> で導入されたもので、XML の仕様書では使われていません。

[18] 擬似属性の一覧
擬似属性の名前XML 仕様書での呼称説明
versionXML の版
encoding符号化宣言実体文字符号化
standalone単独文書宣言外部実体の有無

[22] 擬似属性>>16 に示した順序でのみ指定できます。

[19] XML宣言では version 擬似属性が必須です。

[20] テキスト宣言では encoding 擬似属性が必須です。

[21] standalone 擬似属性XML宣言でのみ使えます。

DOM 表現

[29] DOM3中核では DocumentxmlVersionxmlEncodingxmlStandalone という属性があり、 XML宣言の情報がここに現れます。

[30] 同じくDOM3中核では EntityxmlVersionxmlEncoding という属性があり、テキスト宣言の情報がここに現れます。

[31] 現在の DOM Standard では >>29>>30 も削除されており、XML宣言テキスト宣言の情報にはアクセスできません。 また DOM3 仕様上も、引数実体テキスト宣言にはアクセスできません。

[32] また DOM3 仕様上、XML宣言テキスト宣言の有無の情報にアクセスできるのかは曖昧です。

[33] Chrome>>29 を実装しています。今後削除されるかは不明です。

処理指令との関係

[27] XML処理指令は構文上「xml」が対象名となることを認めていません。 従って、XML宣言テキスト宣言以外でこれらと似た処理指令文書に含めることはできません。

[28] DOMcreateProcessingInstruction メソッド対象名xml かどうかチェックしません。ですからXML宣言テキスト宣言であるかのような処理指令を含む DOM を作ることはできます。

HTML における XML 宣言

[23] (XHTML ではなく) HTML ではXML宣言を使うことができません。かつて XHTMLtext/html で提供することが流行った時代には、XML宣言を含む HTML文書が数多く生み出されました。 しかしHTML構文解析器XML宣言を壊れた注釈と解釈するので、XML宣言に含まれる情報が解釈されることはありません。

[24] かつてはXML宣言の有無が DOCTYPEスイッチに影響するWebブラウザーがありました。

[25] ただしXML宣言の有無により動作を変えているというよりは、未知の文字列として扱っていたとみられます。

[26] HTML なのにXML宣言が含まれる場合、それより前に空白注釈が含まれていることもあります。

メモ

[1] XML 宣言 (というか符号化宣言) って便利なんですよー。 NC4 って日本語の文字コードの判別が今ほど精度よくないんで、たまにシフトJIS日本語EUC 間違っちゃうんです。でも、 NC4 にはもれなく XML 宣言 (や他の処理指令) をもれなく表示しちゃう機能がついてますから、それをみながら文字コードを手動で指定できますっ!

[2]

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<!-- saved from url=(0064)http://foo.example/ -->
<?xml version="1.0" encoding="iso-2022-jp"?><html lang=ja 
xmlns="http://www.w3.org/1999/xhtml" xml:lang="ja"><head><title>
(略)

こういうのを見てどう思います? 出力したのは例の WWWブラウザ

[3] Q: XML 宣言って必須ですよね?

A: いいえ。 XML 宣言は必須ではありません。

XML 宣言必須説、あちこちで見かけるのですけど、お前は本当に仕様書読んだのかと問い詰めたいですよ。
あ、 XML 1.1 をお使いであれば、必須です。

(名無しさん [sage])

[4] 無料鯖とか広告のために内容を改竄する形の鯖のせいで XML 宣言が一番最初じゃなくなることがあるみたいです。 そういう鯖の利用者は XML 宣言つきにするべきではありませんね。むしろへんてこな XML 宣言はつけてはならないですよね。 (名無しさん 2004-07-10 09:05:38 +00:00)

[5] encoding 擬似属性charsetにしている人がいくらかいるみたいです。どうみても非整形式です。本当にありがとうございました。

[35] 時事ドットコム:文化庁の京都移転有力に=「一部機能」軸に検討-政府 ( 版) <http://www.jiji.com/jc/zc?k=201512/2015123000492&g=pol>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<?xml version="1.0" encoding="euc-jp"?>

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:og="http://ogp.me/ns#" xmlns:fb="http://ogp.me/ns/fb#" lang="ja">

<head>

[36] RFC 5070 - The Incident Object Description Exchange Format () <https://tools.ietf.org/html/rfc5070#section-4.1>

Every IODEF document MUST begin with an XML declaration, and MUST

specify the XML version used. If UTF-8 encoding is not used, the

character encoding MUST also be explicitly specified.

[37] RFC 7970 - The Incident Object Description Exchange Format Version 2 () <https://tools.ietf.org/html/rfc7970#section-4.1>

Every IODEF document MUST begin with an XML declaration and MUST

specify the XML version used. The character encoding MUST also be

explicitly specified. UTF-8 [RFC3629] SHOULD be used unless UTF-16

[RFC2781] is necessary. Encodings other than UTF-8 and UTF-16 SHOULD

NOT be used.