ไฟล์ XML ที่ถูกต้องจำเป็นต้องมีการประกาศ XML หรือไม่


122

ฉันกำลังแยกวิเคราะห์ไฟล์ XML โดยใช้ Sax Parser ของ Xerces จำเป็นต้องมี
การประกาศ XML <?xml version="1.0" encoding="UTF-8"?>หรือไม่


3
มีความแตกต่างระหว่างเอกสารที่ถูกต้องและมีรูปแบบที่ดี คุณหมายถึงคนไหน
Felix Kling

ฉันได้รับข้อผิดพลาด prolog / การเข้ารหัส utf-8 ไม่ถูกต้อง จากนั้นฉันพบ BOM ในไฟล์ XML ซึ่งผู้ใช้เปิดไฟล์โดยใช้ notepad (ฉันไม่สามารถหลีกเลี่ยงสิ่งนี้ได้) ฉันไม่แน่ใจว่าฉันหมายถึงเอกสารที่ถูกต้องหรือมีรูปแบบที่ดี เพียงแค่ต้องหลีกเลี่ยงข้อผิดพลาดนั่นคือสาเหตุที่ฉันสร้างฟังก์ชันที่ลบไบต์ทั้งหมดก่อน "<" ซึ่งฉันต้องตรวจสอบให้แน่ใจว่าจำเป็นต้องมีการประกาศส่วนหัว xml พวกคุณคิดว่ายังไง?
eros

มีคลาส Java ที่ลบ BOM หรือไม่? หรือไม่กี่ไบต์จากไฟล์ xml? จาก InputStream ฉันกำลังคิดถึงวิธีการข้ามจาก FilterInputStream & PushbackInputStream แต่ไม่มีความคิดเกี่ยวกับวิธีใช้
eros

@eros: " ฉันไม่แน่ใจว่าฉันกำลังอ้างถึงเอกสารที่ถูกต้องหรือมีรูปแบบที่ดี " โปรดดูXML ที่มีรูปแบบและรูปแบบที่ถูกต้องสำหรับคำอธิบายที่กระชับเกี่ยวกับความแตกต่าง
kjhughes

คำตอบ:


184

ในรูปแบบ XML 1.0 ที่XML ประกาศเป็นตัวเลือก ดูส่วนที่ 2.8 ของคำแนะนำ XML 1.0ซึ่งระบุว่า "ควร" ใช้ซึ่งหมายความว่าแนะนำ แต่ไม่บังคับ ในรูปแบบ XML 1.1 แต่การประกาศเป็นผู้ได้รับมอบอำนาจ ดูส่วน 2.8 ของคำแนะนำ XML 1.1ซึ่งระบุว่า "ต้อง" จึงจะใช้ได้ มันยังระบุต่อไปว่าหากไม่มีการประกาศแสดงว่าเอกสารนั้นเป็นเอกสาร XML 1.0 โดยอัตโนมัติ

โปรดทราบว่าในXML ประกาศencodingและstandaloneมีทั้งที่ไม่จำเป็น เพียง แต่versionมีผลบังคับใช้ นอกจากนี้เหล่านี้จะไม่แอตทริบิวต์ดังนั้นหากพวกเขามีอยู่พวกเขาจะต้องอยู่ในลำดับที่: versionตามด้วยการใด ๆตามด้วยการใด ๆencodingstandalone

<?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 อธิบายวิธีการเข้ารหัสอักขระที่เป็นไปได้วิธีหนึ่งที่สามารถตรวจจับอัตโนมัติได้ ในทางปฏิบัตินี่ไม่ใช่ปัญหามากนักหากอินพุตถูกเข้ารหัสเป็น UTF-8, UTF-16 หรือ US-ASCII การตรวจจับอัตโนมัติจะไม่ทำงานเมื่อพบการเข้ารหัส 8 บิตที่ใช้อักขระนอกช่วง US-ASCII (เช่น ISO 8859-1) - หลีกเลี่ยงการสร้างสิ่งเหล่านี้หากทำได้

standaloneบ่งชี้ว่าเอกสาร XML สามารถประมวลผลได้อย่างถูกต้องโดยไม่ต้อง DTD หรือไม่ คนไม่ค่อยใช้กัน ทุกวันนี้การออกแบบรูปแบบ XML ที่ขาดข้อมูลโดยไม่มี DTD เป็นเรื่องไม่ดี

ปรับปรุง:

ข้อผิดพลาด "ข้อผิดพลาด prolog / การเข้ารหัส utf-8 ไม่ถูกต้อง" บ่งชี้ว่าข้อมูลจริงที่ตัวแยกวิเคราะห์พบภายในไฟล์ไม่ตรงกับการเข้ารหัสที่การประกาศ XML ระบุว่าเป็น หรือในบางกรณีข้อมูลภายในไฟล์ไม่ตรงกับการเข้ารหัสที่ตรวจพบอัตโนมัติ

เนื่องจากไฟล์ของคุณมี byte-order-mark (BOM) จึงควรอยู่ในการเข้ารหัส UTF-16 ฉันสงสัยว่าคำประกาศของคุณระบุว่า<?xml version="1.0" encoding="UTF-8"?>ไม่ถูกต้องอย่างเห็นได้ชัดเมื่อไฟล์ถูกเปลี่ยนเป็น UTF-16 โดย NotePad ทางออกที่ง่ายคือการลบและก็พูดว่าencoding <?xml version="1.0"?>คุณยังสามารถแก้ไขเพื่อพูดได้encoding="UTF-16"แต่นั่นจะผิดสำหรับไฟล์ต้นฉบับ (ซึ่งไม่ได้อยู่ใน UTF-16) หรือหากไฟล์ถูกเปลี่ยนกลับเป็น UTF-8 หรือการเข้ารหัสอื่น ๆ

อย่ากังวลกับการพยายามลบ BOM - นั่นไม่ใช่สาเหตุของปัญหา การใช้ NotePad หรือ WordPad เพื่อแก้ไข XML คือปัญหาที่แท้จริง!


คำถามของฉันได้รับคำตอบ แต่คำถามติดตามของฉันไม่ได้ ฉันต้องสร้างคำถามอื่นสำหรับสิ่งนั้นหรือไม่ หรือกรุณาเพิ่มที่นี่
eros

5
BOM อาจเป็นสาเหตุของปัญหา ตัวแยกวิเคราะห์ XML รุ่นเก่าบางตัวจะไม่ยอมรับ BOM เมื่อเริ่มต้นเอกสาร UTF-8 (ได้รับการออกแบบมาสำหรับ UTF-16 และยอมรับได้เฉพาะกับ UTF-8 ในภายหลัง) แต่ไม่น่าจะเป็นปัญหาหากคุณใช้ Xerces เวอร์ชันล่าสุด
Michael Kay

โปรดทราบว่าในกล่องโต้ตอบ "บันทึกเป็น" ในแผ่นจดบันทึกคุณสามารถเลือกการเข้ารหัสที่จะบันทึก XML ของคุณได้ หากคุณต้องการลบ BOM ให้บันทึกเป็น "ASCII" (สมมติว่าคุณไม่ได้ใช้อักขระ Unicode) สำหรับอักขระ 127 ตัวล่าง ASCII และ UTF-8 จะเหมือนกัน
BrainSlugs83

8

การประกาศ Xml เป็นทางเลือกเพื่อให้ xml ของคุณมีรูปแบบที่ดีหากไม่มี แต่ขอแนะนำให้ใช้เพื่อไม่ให้ตัววิเคราะห์ตั้งสมมติฐานที่ผิดโดยเฉพาะเกี่ยวกับการเข้ารหัสที่ใช้


3
ฉันเป็นคนเดียวที่พบว่ามันแปลกที่คุณบอกแยกวิเคราะห์ XML ว่าจะใช้การเข้ารหัสอะไรหลังจากที่พวกเขาเริ่มถอดรหัสเอกสารของคุณแล้ว? ฉันหมายถึงอย่างชัดเจนถ้ามันสามารถแยกวิเคราะห์แท็กนั้นและเข้าใจสิ่งที่มันพูดแสดงว่ามันได้คิดการเข้ารหัสที่ถูกต้องแล้ว ฉันไม่สามารถนึกถึงการใช้แอตทริบิวต์การเข้ารหัสที่ถูกต้องได้
BrainSlugs83

2
@ BrainSlugs83 ในไม่มี BOM การเข้ารหัสถูกระบุให้เป็น 8 บิต ดังนั้น ASCII หรือ UTF-8 หรือการเข้ารหัสระดับชาติ 8 บิตแบบเก่า การประกาศ XML คือ 8 บิตครึ่งล่างซึ่งมีค่าเท่ากันในการเข้ารหัสเหล่านั้นทั้งหมดและบ่งบอกถึงข้อมูลเพียงพอที่จะเลือกครึ่งบน ไม่ใช่การออกแบบที่ดีที่สุด แต่ก็ยังดีกว่าการคาดเดาระหว่าง CP1241 และ CP866 เหมือนปกติสำหรับไฟล์ข้อความในสมัยก่อน
Eugene Ryabtsev

แต่พวกเขาควรจะสะอาดและบอกว่า XML คือ UTF-8 - จบเรื่อง
Lothar

3

จำเป็นก็ต่อเมื่อคุณไม่ได้ใช้ค่าเริ่มต้นสำหรับversionและencoding(ซึ่งคุณอยู่ในตัวอย่างนั้น)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.