2010-06-14 17 views
5

हम JAXB का उपयोग कर और इस त्रुटि मिलती है एक XML दस्तावेज को पार्स कर रहे हैं:स्पष्टीकरण: 1-बाइट UTF-8 अनुक्रम के अवैध बाइट 1

[org.xml.sax.SAXParseException: Invalid byte 1 of 1-byte UTF-8 sequence.] 
at javax.xml.bind.helpers.AbstractUnmarshallerImpl.createUnmarshalException(AbstractUnmarshallerImpl.java:315) 

वास्तव में क्या मतलब है और हम कैसे हल कर सकते हैं इस??

जारी करना प्रतीत होता है एक्सएमएल फ़ाइल में इस "अजीब" चरित्र के कारण

jaxbContext = JAXBContext.newInstance(Results.class); 
Unmarshaller unmarshaller = jaxbContext.createUnmarshaller(); 
unmarshaller.setSchema(getSchema()); 
results = (Results) unmarshaller.unmarshal(new FileInputStream(inputFile)); 

अपडेट::

हम के रूप में कोड को क्रियान्वित कर रहे हैं ¿

क्यों क्या इस तरह की समस्या होगी ??

अद्यतन 2

वहाँ फाइल में उन अजीब पात्रों में से दो हैं। वे फ़ाइल के बीच में हैं। ध्यान दें कि फ़ाइल डेटाबेस में डेटा के आधार पर बनाई गई है और उन अजीब पात्रों को किसी भी तरह डेटाबेस में मिला है।

<Description><![CDATA[Mt. Belvieu ¿ Texas]]></Description> 

अद्यतन 4

नोट है कि वहाँ कोई <?xml ...?> हैडर:

अद्यतन 3

यहाँ पूर्ण एक्सएमएल टुकड़ा है।

विशेष वर्ण के लिए हेक्स बीएफ

+1

इसका मतलब है कि इनपुट भ्रष्ट है .... अधिक जानकारी के बिना मैं इतना नहीं कह सकता। – skaffman

+0

कुछ और जानकारी जोड़ा गया। क्या इसका कोई मतलब है?? आपकी सहायताके लिए धन्यवाद! –

+1

क्या आप XML फ़ाइल का अनुभाग पोस्ट कर सकते हैं जिसमें अपमानजनक टेक्स्ट शामिल है। – ChrisF

उत्तर

3

तो, आप समस्या यह है कि JAXB UTF-8, जब आपकी फ़ाइल कुछ अन्य एन्कोडिंग का उपयोग करता के रूप में <?xml ...?> हैडर बिना एक्सएमएल फाइल व्यवहार करता है (शायद ISO-8859-1 या विंडोज़ -1252, अगर 0xBF चरित्र वास्तव में ¿ मतलब करने का इरादा) है ।

यदि आप फ़ाइल के निर्माता को बदल सकते हैं, तो आप वास्तविक एन्कोडिंग विनिर्देश के साथ <?xml ...?> शीर्षलेख जोड़ सकते हैं, या फ़ाइल लिखने के लिए केवल यूटीएफ -8 का उपयोग कर सकते हैं।

आप निर्माता को नहीं बदल सकते हैं, तो आप स्पष्ट एन्कोडिंग विनिर्देशन के साथ InputStreamReader उपयोग करने के लिए है, क्योंकि (दुर्भाग्य से) JAXB अपने डिफ़ॉल्ट एन्कोडिंग को बदलने की अनुमति नहीं देते हैं:

results = (Results) unmarshaller.unmarshal(
    new InputStreamReader(new FileInputStream(inputFile), "ISO-8859-1")); 

बहरहाल, यह समाधान है नाजुक - यह अलग-अलग एन्कोडिंग विनिर्देश के साथ <?xml ...?> शीर्षलेख के साथ इनपुट फ़ाइलों पर विफल रहता है।

+0

धन्यवाद, कोशिश करेंगे। ध्यान दें कि जब मैं XSLT का उपयोग कर XML फ़ाइल को आज़माने और प्रारूपित करने के लिए Xalan/Java का उपयोग करता हूं तो मुझे वही त्रुटि मिलती है। क्या ज़लान यूटीएफ -8 भी मानता है? –

+0

यह काम करता है! ध्यान दें कि यह कोड केवल इस फ़ाइल पर चलता है जिसमें कभी भी xml हेडर नहीं होगा। इस दृष्टिकोण के लिए इस दृष्टिकोण बनाम लाभ/भिन्नता क्या है: 'परिणाम = (परिणाम) unmarshaller.unmarshal (नया फ़ाइल रीडर (इनपुटफाइल)); ' –

+1

@Marcus:' FileReader' सिस्टम डिफ़ॉल्ट एन्कोडिंग का उपयोग करता है, जब 'इनपुटस्ट्रीम रीडर 'स्पष्ट रूप से निर्दिष्ट एक का उपयोग करता है। – axtavt

1

शायद एक Byte Order Mark (BOM) है यही कारण है, और एक UTF फ़ाइल के शुरू में एक विशेष बाइट क्रम है। वे स्पष्ट रूप से, गधे में दर्द कर रहे हैं, और .NET सिस्टम के साथ बातचीत करते समय विशेष रूप से आम लगते हैं।

एक Reader बल्कि InputStream एक से उपयोग करने के लिए अपने कोड अलग ढंग से व्यक्त प्रयास करें:

results = (Results) unmarshaller.unmarshal(new FileReader(inputFile)); 

एक Reader UTF-बारे में पता है, और यह एक बेहतर वार कर सकता है। अधिक बस, इसके बारे में Unmarshaller के लिए सीधे File गुजरती हैं, और जाने JAXBContext चिंता:

results = (Results) unmarshaller.unmarshal(inputFile); 
+0

जोड़ा गया मैं इसे आजमा सकता हूं। ध्यान दें कि फ़ाइल में से दो वर्ण हैं - पोस्ट में दूसरा अपडेट देखें। –

+0

'फ़ाइल रीडर' का उपयोग करना अच्छा लगता है। जब मैंने अभी 'फाइल' निर्दिष्ट किया है तो वही त्रुटि मिल गई। मेरे सभी परिणामों को प्रमाणित करने के लिए जा रहा है लेकिन यह अच्छा लग रहा है! –

+0

लेकिन इसलिए मैं समझता हूं, ये सिर्फ "अजीब" पात्रों की तरह लगते हैं, न कि "बाइट ऑर्डर मार्क", नहीं? वे इस समस्या का कारण क्यों बनाते हैं? –

0

यह के रूप में यदि आपके XML UTF-16 के साथ इनकोडिंग लगता है लेकिन यह है कि एन्कोडिंग Unmarshaller को पास नहीं हो रही है। मार्शलर के साथ आप marshaller.setProperty(Marshaller.JAXB_ENCODING, "UTF-16"); का उपयोग करके सेट कर सकते हैं, लेकिन क्योंकि Unmarshaller को किसी भी गुण का समर्थन करने की आवश्यकता नहीं है, इसलिए मुझे यकीन नहीं है कि आपके XML दस्तावेज़ को encoding="UTF-16" प्रारंभिक <?xml?> तत्व में सुनिश्चित करने के अलावा अन्य को कैसे लागू किया जाए।

+1

यह यूटीएफ -16 नहीं हो सकता है - यूटीएफ -16-एन्कोडेड एक्सएमएल फ़ाइल को पार्स करने का प्रयास यूटीएफ -8 गलत मार्कअप के कारण विफल हो जाएगा। यह शायद कुछ एकल बाइट एन्कोडिंग है। – axtavt

+0

आप सही हैं। मैं विभिन्न एन्कोडिंग देख रहा था और मिश्रित हो गया। – Andy

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