有効なXMLファイルにはXML宣言が必要ですか?


122

XercesのSax Parserを使用してXMLファイルを解析しています。
XML宣言は<?xml version="1.0" encoding="UTF-8"?>必要ですか?


3
有効なドキュメントと整形式のドキュメントには違いがあります。どういう意味ですか?
Felix Kling、2011

プロローグエラー/無効なutf-8エンコーディングを受信して​​います。次に、ユーザーがメモ帳を使用してファイルを開くXMLファイルでBOMを見つけました(これは避けられません)。有効な文書または整形式の文書を参照しているのかわかりません。エラーを回避する必要があるので、「<」の前のすべてのバイトを削除する関数を作成しています。xmlヘッダー宣言が必要であることを確認する必要があります。みんなどう思いますか?
エロス2011

BOMの削除を行うJavaクラスはありますか?またはXMLファイルから数バイト?InputStreamから。FilterInputStreamとPushbackInputStreamからのskipメソッドを考えていますが、その使用方法がわかりません。
エロス2011

@eros:「有効なドキュメントまたは整形式のドキュメントを指しているのかわかりません」違いの簡潔な説明については、整形式有効なXMLを参照してください。
kjhughes 2014年

回答:


184

XML 1.0では、XML宣言オプションですXML 1.0の推奨事項のセクション2.8を参照してください。このセクションでは、「使用する必要がある」と記載されています。ただし、XML 1.1では、宣言は必須です。XML 1.1勧告のセクション2.8をご覧ください。さらに、宣言が存在しない場合、それはドキュメントがXML 1.0ドキュメントであることを自動的に暗示します。

注そのXML宣言encodingstandaloneの両方のオプションです。のみversion必須です。また、これらは、彼らが存在している場合ので、彼らはそのためにある必要があり、属性がされていない:version、任意の続くencoding任意の続きます、standalone

<?xml version="1.0"?>
<?xml version="1.0" encoding="UTF-8"?>
<?xml version="1.0" standalone="yes"?>
<?xml version="1.0" encoding="UTF-16" standalone="yes"?>

この方法でエンコーディングを指定しない場合、XMLパーサーは使用されているエンコーディングを推測しようとします。XML 1.0勧告では、文字エンコーディングを自動検出できる 1つの可能な方法について説明しています。実際には、入力がUTF-8、UTF-16、またはUS-ASCIIとしてエンコードされている場合、これはそれほど問題にはなりません。US-ASCIIの範囲外の文字(ISO 8859-1など)を使用する8ビットエンコーディングが検出された場合、自動検出は機能しません-可能な場合は作成しないでください。

standaloneXML文書が正しくDTDかをすることなく処理することができるかどうかを示します。人々はめったにそれを使用しません。最近では、DTDなしで情報が欠落しているXML形式を設計することは悪いことです。

更新:

「プロローグエラー/無効なutf-8エンコーディング」エラーは、パーサーがファイル内で見つけた実際のデータが、XML宣言が示すエンコーディングと一致しなかったことを示します。または、ファイル内のデータが自動検出されたエンコードと一致しない場合がありました。

ファイルにバイトオーダーマーク(BOM)が含まれているため、UTF-16エンコーディングである必要があります。<?xml version="1.0" encoding="UTF-8"?>ファイルがNotePadによってUTF-16に変更されている場合、あなたの宣言は明らかに正しくないことを示していると思います。簡単な解決策は、を削除してencoding、単に言うこと<?xml version="1.0"?>です。言うように編集することもできますがencoding="UTF-16"、元のファイル(UTF-16に含まれていなかった)の場合、またはファイルがなんらかの理由でUTF-8または他のエンコードに変更された場合は誤りです。

BOMを削除しようとしないでください。それが問題の原因ではありません。NotePadまたはWordPadを使用してXMLを編集するのが本当の問題です。


私の質問には回答しましたが、私のフォロー質問には回答しませんでした。そのために別の質問を作成する必要がありますか?またはここに追加してください。
エロス2011

5
BOMが問題の原因である可能性があります。一部の古いXMLパーサーは、UTF-8ドキュメントの開始時にBOMを受け入れません(これはUTF-16用に設計されており、後でUTF-8でのみ受け入れられるようになりました)。しかし、Xercesの最新バージョンを使用している場合は、問題になることはほとんどありません。
マイケルケイ

また、メモ帳の[名前を付けて保存]ダイアログで、XMLとして保存するエンコードを選択できることにも注意してください。BOMを削除する場合は、「ASCII」として保存するだけです(Unicode文字を使用していないと仮定)。下位127文字については、ASCIIとUTF-8は同じです。
BrainSlugs83 2013

8

XML宣言はオプションであるため、XMLはそれなしで整形式です。しかし、特に使用されるエンコーディングに関して、パーサーによって誤った仮定が行われないように、それを使用することをお勧めします。


3
私がXMLパーサーに、ドキュメントのデコードを既に開始した後で、どのエンコードを使用するかを指示するのを奇妙に思う唯一の人ですか?つまり、そのタグを解析してその内容を理解できれば、正しいエンコーディングがすでにわかっているということです。encoding属性の正当な使用法は考えられません。
BrainSlugs83 2013

2
@ BrainSlugs83 BOMがない場合、エンコーディングは8ビットに指定されています。したがって、ASCIIまたはUTF-8のいずれか、あるいはそれらのいずれかが古い8ビット国別エンコーディングです。XML宣言はすべて下位8ビットであり、すべてのエンコーディングで同等であり、上位半分を選択するのに十分な情報を伝達します。最高のデザインではありませんが、たとえばCP1241とCP866の間を推測するよりは、昔のテキストファイルでは一般的でしたが、それよりも優れています。
Eugene Ryabtsev

ただし、XMLはUTF-8であり、話は終わりです。
Lothar

3

versionand のデフォルト値encoding(その例では)を使用していない場合にのみ必要です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.