क्या वैध XML फ़ाइल के लिए XML घोषणा की आवश्यकता है?


122

मैं Xxces के सैक्स पार्सर का उपयोग करके XML फ़ाइल पार्स कर रहा हूं।
क्या XML घोषणा की <?xml version="1.0" encoding="UTF-8"?>आवश्यकता है?


3
वैध और अच्छी तरह से गठित दस्तावेजों के बीच अंतर है। आप में से किसका मतलब है?
फेलिक्स क्लिंग

मुझे prolog त्रुटि / अमान्य utf-8 एन्कोडिंग प्राप्त हो रही है। तब मुझे XML फ़ाइल में BOM मिली जिसे उपयोगकर्ता ने नोटपैड का उपयोग करके फ़ाइल को खोला (मैं इससे बच नहीं सकता)। मुझे यकीन नहीं है कि मैं एक वैध या अच्छी तरह से गठित दस्तावेजों का जिक्र कर रहा हूं। बस त्रुटियों से बचने की आवश्यकता है, इसलिए मैं एक फ़ंक्शन बना रहा हूं जो "<" से पहले सभी बाइट्स को हटा दें। जो मुझे यह सुनिश्चित करने की आवश्यकता है कि xml हैडर घोषणा की आवश्यकता है। तुम लोग क्या सोचते हो?
एरोस

क्या कोई जावा वर्ग बीओएम को हटाता है? या xml फ़ाइल से कुछ बाइट्स? InputStream से मैं FilterInputStream और PushbackInputStream से स्किप करने की विधि के बारे में सोच रहा हूं, लेकिन इसका उपयोग कैसे करें, इस बारे में कोई विचार नहीं है।
एरोस

@eros: " मुझे यकीन नहीं है कि मैं एक वैध या अच्छी तरह से गठित दस्तावेजों का जिक्र करता हूं " अंतर के संक्षिप्त विवरण के लिए वेल-गठित बनाम मान्य XML देखें ।
kjhughes

जवाबों:


184

XML 1.0 में, एक्सएमएल घोषणा है वैकल्पिकXML 1.0 अनुशंसा का अनुभाग 2.8 देखें , जहां यह कहता है कि इसका "उपयोग" किया जाना चाहिए - जिसका अर्थ है कि यह अनुशंसित है, लेकिन अनिवार्य नहीं है। एक्सएमएल 1.1 में, हालांकि, घोषणा अनिवार्य हैXML 1.1 अनुशंसा के अनुभाग 2.8 को देखें , जहां यह कहता है कि "MUST" का उपयोग किया जाना चाहिए। यहां तक ​​कि यह भी बताया गया है कि यदि घोषणा अनुपस्थित है, तो इसका मतलब है कि दस्तावेज़ स्वतः एक्सएमएल 1.0 दस्तावेज़ है।

ध्यान दें कि XML घोषणा में encodingऔर standaloneदोनों वैकल्पिक हैं। केवल 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 पार्सर यह अनुमान लगाने की कोशिश करते हैं कि एन्कोडिंग का क्या उपयोग किया जा रहा है। एक्सएमएल 1.0 सिफारिश में वर्णन किया गया है कि एक संभव तरीका चरित्र एन्कोडिंग को स्वचालित किया जा सकता है । व्यवहार में, यह एक समस्या नहीं है यदि इनपुट को UTF-8, UTF-16 या US-ASCII के रूप में एन्कोड किया गया है। ऑटोडेटेक्शन तब काम नहीं करता है जब यह 8-बिट एनकोडिंग का सामना करता है जो यूएस-एएससीआईआई श्रेणी (जैसे आईएसओ 8859-1) के बाहर के पात्रों का उपयोग करते हैं - यदि आप कर सकते हैं तो इन बनाने से बचें।

standaloneयह दर्शाता है कि XML दस्तावेज़ सही ढंग से DTD के बिना या नहीं संसाधित किया जा सकता। लोग शायद ही इसका उपयोग करते हैं। इन दिनों, एक्सएमएल प्रारूप को डिजाइन करना एक बुरा है जो कि अपने डीटीडी के बिना जानकारी गायब है।

अपडेट करें:

"प्रोलॉग एरर / अमान्य यूटीएफ -8 एन्कोडिंग" त्रुटि इंगित करती है कि फ़ाइल के अंदर पाया गया वास्तविक डेटा पार्सर उस एनकोडिंग से मेल नहीं खाता जो एक्सएमएल घोषणा कहती है। या कुछ मामलों में फ़ाइल के अंदर डेटा ऑटोडेटेड एन्कोडिंग से मेल नहीं खाता।

चूँकि आपकी फ़ाइल में बाइट-ऑर्डर-मार्क (BOM) होता है, यह UTF-16 एन्कोडिंग में होना चाहिए। मुझे संदेह है कि आपकी घोषणा कहती है <?xml version="1.0" encoding="UTF-8"?>जो स्पष्ट रूप से गलत है जब फ़ाइल को नोटपैड द्वारा UTF-16 में बदल दिया गया है। सरल उपाय यह है कि इसे हटा दें encodingऔर बस कहें <?xml version="1.0"?>। आप यह कहने के लिए इसे संपादित भी कर सकते हैं encoding="UTF-16"लेकिन यह मूल फ़ाइल (जो UTF-16 में नहीं थी) के लिए गलत होगा या यदि फ़ाइल किसी तरह वापस UTF-8 या किसी अन्य एन्कोडिंग में बदल जाती है।

BOM को निकालने का प्रयास न करें - यह समस्या का कारण नहीं है। XML को संपादित करने के लिए नोटपैड या वर्डपैड का उपयोग करना वास्तविक समस्या है!


मेरे प्रश्न का उत्तर दिया गया था, लेकिन मेरा अनुसरण प्रश्न नहीं था। क्या मुझे उसके लिए एक और प्रश्न बनाने की आवश्यकता है? या कृपया इसे यहाँ जोड़ें।
एरोस

5
BOM समस्या का कारण हो सकता है। कुछ पुराने XML पार्सर UTF-8 दस्तावेज़ की शुरुआत में BOM स्वीकार नहीं करेंगे (यह UTF-16 के लिए डिज़ाइन किया गया था, और केवल बाद में UTF-8 के साथ स्वीकार्य हो गया)। यदि आप Xerces के हालिया संस्करण का उपयोग कर रहे हैं तो यह एक समस्या नहीं है।
माइकल

यह भी ध्यान दें, कि नोटपैड में "सेव अस" डायलॉग में आप चुन सकते हैं कि आपके एक्सएमएल को बचाने के लिए कौन सी एन्कोडिंग है। यदि आप BOM को निकालना चाहते हैं, तो बस "ASCII" के रूप में सहेजें (यह मानते हुए कि आप किसी भी यूनिकोड वर्ण का उपयोग नहीं कर रहे हैं)। निचले 127 वर्णों के लिए, ASCII और UTF-8 समान हैं।
BrainSlugs83

8

Xml घोषणा वैकल्पिक है, इसलिए आपका xml इसके बिना सुव्यवस्थित है। लेकिन इसका उपयोग करने की सिफारिश की जाती है ताकि पार्सर्स द्वारा गलत धारणाएं न बनाई जाएं, विशेष रूप से उपयोग किए गए एन्कोडिंग के बारे में।


3
क्या मैं अकेला हूँ जो इसे विचित्र लगता है कि आप XML पार्सर्स को बताएं कि आपके दस्तावेज़ को पहले से ही डिकोड करने के बाद एन्कोडिंग का क्या उपयोग करना है? मेरा स्पष्ट रूप से मतलब है, अगर यह उस टैग को पार्स कर सकता है और समझ सकता है कि यह क्या कहता है, तो यह पहले से ही सही एन्कोडिंग का पता लगा चुका है। मैं एन्कोडिंग विशेषता के लिए किसी भी वैध उपयोग के बारे में नहीं सोच सकता।
BrainSlugs83

2
@ BrainSlugs83 कोई BOM में, एन्कोडिंग 8-बिट होना निर्दिष्ट है। इसलिए या तो ASCII या UTF-8 या उनमें से कोई भी पुराना 8-बिट राष्ट्रीय एन्कोडिंग है। एक्सएमएल घोषणा सभी निचले आधे 8-बिट है, जो उन सभी एन्कोडिंग के बीच बराबर है और ऊपरी आधे का चयन करने के लिए पर्याप्त घुसपैठ की पुष्टि करता है। डिज़ाइन का सबसे अच्छा नहीं है, लेकिन अभी भी बीच का अनुमान लगाने से बेहतर है, कहते हैं, CP1241 और CP866 पुराने दिनों की पाठ फ़ाइलों के लिए आम था।
यूजीन रयबत्सेव

लेकिन उन्हें साफ हो जाना चाहिए और कहना चाहिए कि XML UTF-8 - कहानी का अंत है।
लोथल

3

यह केवल तभी आवश्यक है जब आप डिफ़ॉल्ट मानों का उपयोग नहीं कर रहे हैं versionऔर encoding(जो आप उस उदाहरण में हैं)।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.