web-dev-qa-db-ja.com

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

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

112
eros

XML 1.0では、XML宣言optionalです。 XML 1.0勧告のセクション2.8 を参照してください。「使用する必要がある」と書かれています。つまり、推奨されていますが必須ではありません。ただし、XML 1.1では、宣言はmandatoryです。 XML 1.1勧告のセクション2.8 を参照してください。「=」を使用する必要があります。さらに、if宣言が存在しない、つまり、ドキュメントがXML 1.0ドキュメントであることを自動的に暗示していると述べることもあります。

XML宣言では、encodingstandaloneは両方ともオプションであることに注意してください。 versionのみが必須です。また、これらは属性ではないため、存在する場合は、versionencodingstandaloneの順になければなりません。

<?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ビットエンコーディングを検出すると機能しません-可能な場合は作成しないでください。

standaloneは、DTDなしでXMLドキュメントを正しく処理できるかどうかを示します。人々はめったにそれを使用しません。最近では、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を編集することが本当の問題です!

169
Hoylen

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

8

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

3
Quentin