Apakah file XML yang valid memerlukan deklarasi XML?

122

Saya mengurai file XML menggunakan Sax Parser of Xerces.
Apakah deklarasi XML <?xml version="1.0" encoding="UTF-8"?>diperlukan?

eros
sumber
3
Ada perbedaan antara dokumen yang valid dan yang dibentuk dengan baik. Yang mana yang Anda maksud?
Felix Kling
Saya menerima kesalahan prolog / pengkodean utf-8 tidak valid. Kemudian saya menemukan BOM dalam file XML dimana pengguna membuka file tersebut menggunakan notepad (saya tidak bisa menghindari ini). saya tidak yakin saya mengacu pada dokumen yang valid atau berformat baik. Hanya perlu menghindari kesalahan itu sebabnya saya membuat fungsi yang menghapus semua byte sebelum "<". Yang saya perlukan untuk memastikan bahwa deklarasi header xml diperlukan. Bagaimana menurut kalian guys?
eros
Apakah ada kelas java yang menghapus BOM? atau beberapa byte dari file xml? dari InputStream. Saya sedang memikirkan metode lewati dari FilterInputStream & PushbackInputStream tetapi tidak tahu cara menggunakannya.
eros
@ eros: " Saya tidak yakin saya mengacu pada dokumen yang valid atau berformat baik " Lihat XML dengan format yang baik vs XML untuk penjelasan singkat tentang perbedaannya.
kjhughes

Jawaban:

184

Dalam XML 1.0, Deklarasi XML bersifat opsional . Lihat bagian 2.8 dari Rekomendasi XML 1.0 , di mana dikatakan "harus" digunakan - yang berarti disarankan, tetapi tidak wajib. Namun, dalam XML 1.1, deklarasi tersebut bersifat wajib . Lihat bagian 2.8 dari Rekomendasi XML 1.1 , di mana dikatakan "HARUS" digunakan. Ia bahkan melanjutkan dengan menyatakan bahwa jika deklarasi tidak ada, yang secara otomatis menyiratkan bahwa dokumen tersebut adalah dokumen XML 1.0.

Perhatikan bahwa dalam Deklarasi XML , encodingdan standalonekeduanya opsional. Hanya yang versionwajib. Juga, ini bukan atribut, jadi jika ada, harus dalam urutan seperti itu:, versiondiikuti oleh apa saja encoding, diikuti oleh apa saja 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"?>

Jika Anda tidak menentukan pengkodean dengan cara ini, pengurai XML mencoba menebak pengkodean apa yang digunakan. Rekomendasi XML 1.0 menjelaskan satu kemungkinan cara pengkodean karakter dapat dideteksi secara otomatis . Dalam praktiknya, ini tidak menjadi masalah jika input dikodekan sebagai UTF-8, UTF-16 atau US-ASCII. Deteksi otomatis tidak berfungsi saat menemukan pengkodean 8-bit yang menggunakan karakter di luar rentang US-ASCII (misalnya ISO 8859-1) - hindari membuat ini jika Anda bisa.

The standalonemenunjukkan apakah dokumen XML dapat benar diproses tanpa DTD atau tidak. Orang jarang menggunakannya. Hari-hari ini, adalah buruk untuk mendesain format XML yang kehilangan informasi tanpa DTD-nya.

Memperbarui:

Kesalahan "kesalahan prolog / pengkodean utf-8 tidak valid" menunjukkan bahwa data aktual yang ditemukan parser di dalam file tidak cocok dengan pengkodean yang disebutkan dalam deklarasi XML. Atau dalam beberapa kasus, data di dalam file tidak cocok dengan encoding yang terdeteksi otomatis.

Karena file Anda berisi byte-order-mark (BOM), itu harus dalam encoding UTF-16. Saya menduga bahwa pernyataan Anda mengatakan <?xml version="1.0" encoding="UTF-8"?>yang jelas tidak benar ketika file telah diubah menjadi UTF-16 oleh NotePad. Solusi sederhananya adalah dengan menghapus encodingdan hanya mengatakan <?xml version="1.0"?>. Anda juga dapat mengeditnya untuk mengatakan encoding="UTF-16"tetapi itu akan salah untuk file asli (yang tidak ada di UTF-16) atau jika file entah bagaimana diubah kembali ke UTF-8 atau pengkodean lainnya.

Jangan repot-repot mencoba menghapus BOM - itu bukan penyebab masalahnya. Menggunakan NotePad atau WordPad untuk mengedit XML adalah masalah sebenarnya!

Hoylen
sumber
Pertanyaan saya dijawab tetapi pertanyaan ikuti saya tidak. Apakah saya perlu membuat pertanyaan lain untuk itu? atau tambahkan di sini.
eros
5
BOM bisa menjadi penyebab masalah. Beberapa parser XML lama tidak akan menerima BOM pada awal dokumen UTF-8 (ini dirancang untuk UTF-16, dan hanya dapat diterima dengan UTF-8 nanti). Tetapi itu tidak akan menjadi masalah jika Anda menggunakan Xerces versi terbaru.
Michael Kay
Perhatikan juga, bahwa dalam dialog "Simpan Sebagai" di notepad Anda dapat memilih pengkodean apa untuk menyimpan XML Anda sebagai. Jika Anda ingin menghapus BOM, simpan saja sebagai "ASCII" (dengan asumsi Anda tidak menggunakan karakter Unicode). Untuk 127 karakter yang lebih rendah, ASCII dan UTF-8 identik.
BrainSlugs83
8

Deklarasi Xml bersifat opsional sehingga xml Anda terbentuk dengan baik tanpanya. Namun disarankan untuk menggunakannya agar asumsi yang salah tidak dibuat oleh parser, khususnya tentang encoding yang digunakan.

Aravind Yarram
sumber
3
Apakah saya satu-satunya yang merasa aneh bahwa Anda memberi tahu pengurai XML pengkodean apa yang akan digunakan setelah mereka mulai mendekode dokumen Anda? Maksud saya dengan jelas, jika itu dapat mengurai tag itu dan memahami apa yang dikatakannya, maka itu telah menemukan pengkodean yang benar. Saya tidak dapat memikirkan penggunaan yang sah untuk atribut encoding.
BrainSlugs83
2
@ BrainSlugs83 Tanpa BOM, pengkodeannya ditetapkan menjadi 8-bit. Jadi baik ASCII atau UTF-8 atau salah satunya pengkodean nasional 8-bit lama. Deklarasi XML adalah semua bagian bawah 8-bit, yang sama di antara semua penyandiaksaraan tersebut dan menyampaikan informasi yang cukup untuk memilih bagian atas. Bukan yang terbaik dari desain, tapi masih lebih baik daripada menebak antara, katakanlah, CP1241 dan CP866 seperti yang umum untuk file teks di masa lalu.
Eugene Ryabtsev
Tetapi mereka seharusnya sudah bersih dan mengatakan XML adalah UTF-8 - akhir cerita.
Lothar
3

Ini hanya diperlukan jika Anda tidak menggunakan nilai default untuk versiondan encoding(yang Anda gunakan dalam contoh itu).

Quentin
sumber