Geçerli bir XML dosyası XML bildirimi gerektirir mi?


122

Xerces Sax Parser kullanarak bir XML dosyasını ayrıştırıyorum.
XML bildirimi <?xml version="1.0" encoding="UTF-8"?>gerekli mi?


3
Geçerli ve iyi biçimlendirilmiş belgeler arasında bir fark vardır. Bunlardan hangisini kastediyorsunuz?
Felix Kling

Prolog hatası / geçersiz utf-8 kodlaması alıyorum. Daha sonra kullanıcının not defteri kullanarak dosyayı açtığı XML dosyasında BOM'u buldum (bundan kaçınamıyorum). Geçerli veya iyi biçimlendirilmiş bir belgeden bahsettiğimden emin değilim. Sadece hatalardan kaçınmam gerekiyor, bu yüzden "<" öncesindeki tüm baytları kaldıran bir işlev oluşturuyorum. Hangi xml başlık bildiriminin gerekli olduğundan emin olmalıyım. Siz ne düşünüyorsunuz beyler?
eros

BOM'un kaldırılması için bir java sınıfı var mı? veya xml dosyasından birkaç bayt? InputStream'den. FilterInputStream ve PushbackInputStream'den yöntemi atlamayı düşünüyorum ama nasıl kullanılacağı konusunda fikrim yok.
eros

@eros: " Ben emin ı geçerli bir veya iyi biçimlendirilmiş belgeler bahsediyorum değilim " See Geçerli XML vs İyi oluşturulmuş farkın özlü açıklama için.
kjhughes

Yanıtlar:


184

XML 1.0'da, XML Bildirgesi ise opsiyonel . XML 1.0 Tavsiyesinin "kullanılması gerektiğini" söylediği bölüm 2.8'e bakın - yani tavsiye edilir, ancak zorunlu değildir. XML 1.1'de ise bildirim zorunludur . Kullanılması "ZORUNLU" yazan XML 1.1 Tavsiyesi bölüm 2.8'e bakın . O bile devlete gider eğer beyanı yoktur, yani otomatik belge XML 1.0 belgesidir ima eder.

Bir o Not Deklarasyonu XMLencoding ve standalonehem isteğe bağlıdır. Yalnızca versionzorunludur. Ayrıca, bunlar öznitelikler değildir, bu nedenle eğer mevcutlarsa, şu sırayla olmalıdırlar: versionve ardından herhangi biri encoding, ardından herhangi biri 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"?>

Kodlamayı bu şekilde belirtmezseniz, XML ayrıştırıcıları hangi kodlamanın kullanıldığını tahmin etmeye çalışır. XML 1.0 Önerisi, karakter kodlamanın otomatik olarak saptanmasının olası bir yolunu açıklar . Pratikte, girdi UTF-8, UTF-16 veya US-ASCII olarak kodlanmışsa bu pek sorun olmaz. Otomatik algılama, US-ASCII aralığı dışındaki karakterleri kullanan 8 bit kodlamalarla karşılaştığında çalışmaz (örn. ISO 8859-1) - yapabiliyorsanız bunları oluşturmaktan kaçının.

standaloneXML belgesi doğru DTD olmadan veya işlenebilir olup olmadığını gösterir. İnsanlar onu nadiren kullanır. Bu günlerde, DTD'siz bilgileri eksik olan bir XML formatı tasarlamak kötü.

Güncelleme:

"Prolog hatası / geçersiz utf-8 kodlaması" hatası, ayrıştırıcının dosya içinde bulduğu gerçek verilerin XML bildiriminde söylediği kodlamayla eşleşmediğini gösterir. Veya bazı durumlarda, dosyanın içindeki veriler otomatik olarak algılanan kodlamayla eşleşmedi.

Dosyanız bir bayt sırası işareti (BOM) içerdiğinden, UTF-16 kodlamasında olmalıdır. Bildiriminizin <?xml version="1.0" encoding="UTF-8"?>, dosya NotePad tarafından UTF-16 olarak değiştirildiğinde bunun açıkça yanlış olduğunu söylediğinden şüpheleniyorum . Basit çözüm, kaldırmak encodingve basitçe söylemektir <?xml version="1.0"?>. Bunu söylemek için de düzenleyebilirsiniz, encoding="UTF-16"ancak bu orijinal dosya için (UTF-16'da değildi) veya dosya bir şekilde UTF-8'e veya başka bir kodlamaya değiştirilirse yanlış olur.

Malzeme Listesini kaldırmaya çalışmakla uğraşmayın - sorunun nedeni bu değil. XML düzenlemek için NotePad veya WordPad kullanmak gerçek problemdir!


Sorum cevaplandı ama takip sorum cevaplanmadı. Bunun için başka bir soru oluşturmam gerekiyor mu? veya lütfen buraya ekleyin.
eros

5
Ürün reçetesi, sorunun nedeni olabilir. Bazı eski XML ayrıştırıcıları, UTF-8 belgesinin başlangıcında bir BOM'u kabul etmeyecektir (UTF-16 için tasarlanmıştır ve daha sonra UTF-8 ile kabul edilebilir hale gelmiştir). Ancak Xerces'in yeni bir sürümünü kullanıyorsanız sorun olması pek olası değildir.
Michael Kay

Ayrıca not defterinde "Farklı Kaydet" iletişim kutusunda XML'inizi hangi kodlama olarak kaydedeceğinizi seçebileceğinizi unutmayın. Malzeme Listesini kaldırmak istiyorsanız, "ASCII" olarak kaydetmeniz yeterlidir (herhangi bir Unicode karakter kullanmadığınızı varsayarak). Daha düşük 127 karakter için ASCII ve UTF-8 aynıdır.
BrainSlugs83

8

Xml bildirimi isteğe bağlıdır, bu nedenle xml'niz onsuz iyi biçimlendirilir. Ancak, ayrıştırıcılar tarafından özellikle kullanılan kodlama hakkında yanlış varsayımlarda bulunulmaması için kullanılması önerilir.


3
XML ayrıştırıcılarına belgenizin kodunu çözmeye başladıktan sonra hangi kodlamayı kullanacaklarını söylemenizi tuhaf bulan tek kişi ben miyim? Demek istediğim, eğer bu etiketi ayrıştırıp ne dediğini anlayabilirse, o zaman doğru kodlamayı çoktan bulmuş demektir. Kodlama özelliği için herhangi bir yasal kullanım düşünemiyorum.
BrainSlugs83

2
@ BrainSlugs83 Hiçbir BOM'da kodlama 8-bit olarak belirtilmiştir. Yani ya ASCII ya da UTF-8 ya da eski 8 bitlik ulusal kodlama. XML bildirimi, tüm bu kodlamalar arasında eşit olan ve üst yarıyı seçmek için yeterli bilgi aktaran 8-bitlik yarımdır. Tasarımın en iyisi değil, ama yine de eski günlerdeki metin dosyalarında yaygın olan CP1241 ve CP866 arasında tahmin etmekten daha iyi.
Eugene Ryabtsev

Ancak netleşmeli ve XML'in UTF-8 olduğunu söylemeliler - hikayenin sonu.
Lothar

3

Yalnızca versionve encoding(bu örnekte olduğunuz) için varsayılan değerleri kullanmıyorsanız gereklidir .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.