2011-08-10 144 views
98

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

+3

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

+0

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

+0

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

उत्तर

145

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

कृपया ध्यान दें कि एक्सएमएल घोषणा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"?> 

आप इस तरह से एन्कोडिंग निर्दिष्ट नहीं करते हैं, एक्सएमएल पारसर्स अनुमान लगाना क्या एन्कोडिंग का प्रयोग किया जा रहा है की कोशिश करो। एक्सएमएल 1.0 सिफारिश एक संभावित तरीके से वर्णन करती है character encoding can be autodetected। व्यावहारिक रूप से, यदि इनपुट यूटीएफ -8, यूटीएफ -16 या यूएस-एएससीआईआईआई के रूप में एन्कोड किया गया है तो यह कोई समस्या नहीं है। ऑटोडेक्चर काम नहीं करता है जब यह 8-बिट एन्कोडिंग का सामना करता है जो यूएस-एएससीआईआईआई रेंज (जैसे आईएसओ 885 9 -1) के बाहर वर्णों का उपयोग करता है - यदि आप कर सकते हैं तो इन्हें बनाने से बचें।

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

अद्यतन:

ए 'prolog त्रुटि/अमान्य UTF-8 एन्कोडिंग "त्रुटि इंगित करता है कि वास्तविक डेटा पार्सर फाइल के अंदर पाया एन्कोडिंग कि XML घोषणा यह है कहते हैं मेल नहीं खाती। या कुछ मामलों में फ़ाइल के अंदर डेटा autodetected एन्कोडिंग से मेल नहीं खाता था।

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

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

+0

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

+4

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

+0

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

8

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

+3

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

+2

@ BrainSlugs83 कोई बीओएम में, एन्कोडिंग 8-बिट होने के लिए निर्दिष्ट है। तो या तो एएससीआईआई या यूटीएफ -8 या उनमें से कोई भी पुराना 8-बिट राष्ट्रीय एन्कोडिंग। एक्सएमएल घोषणा सभी आधा 8-बिट है, जो उन सभी एन्कोडिंग के बराबर है और ऊपरी आधा चुनने के लिए पर्याप्त उल्लंघन का संदेश देती है। डिजाइन का सबसे अच्छा नहीं है, लेकिन सीपी 1241 और सीपी 866 के बीच अनुमान लगाने के मुकाबले बेहतर है, जो पुराने दिनों की टेक्स्ट फाइलों के लिए आम था। –

+0

लेकिन उन्हें साफ जाना चाहिए था और कहना है कि एक्सएमएल यूटीएफ -8 है - कहानी का अंत। – Lothar

3

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

संबंधित मुद्दे