2010-11-21 14 views
10

मुझे एंड्रॉइड पर एक XML दस्तावेज़ को पार्स करने का प्रयास करते समय "SAXParseException: दस्तावेज़ का अप्रत्याशित अंत" त्रुटि मिल रही है।एंड्रॉइड पर सैक्सपर्सर: दस्तावेज़ अपवाद का अप्रत्याशित अंत

प्रश्न में दस्तावेज़ Google मौसम एपीआई से है, लेकिन यह xml फ़ाइल के सवाल के बावजूद एक ही त्रुटि फेंकने लगता है (जब तक कि एक्सएमएल मान्य है) तो मुझे संदेह है कि यह मेरे दृष्टिकोण के साथ एक समस्या है, बल्कि एक्सएमएल की तुलना में।

यह एक सीखने व्यायाम के रूप में किया जा रहा है, तो मैं शायद (उम्मीद) कुछ स्पष्ट =)

मैं एक ऑनलाइन सत्यापनकर्ता के माध्यम से एक्सएमएल दौड़े हैं अनदेखी की है, और यह अच्छी तरह से गठन किया जा रहा है वापस आता है। (मुझे यह नहीं बता सकता कि यह वैध है क्योंकि मेरे पास डीटीडी नहीं है, लेकिन मुझे नहीं लगता कि मुझे एक्सएमएल को पार्स करने के लिए डीटीडी की आवश्यकता है)।

private void refreshForecast() 
     URL url; 
     try {  
       url = new URL("http://192.168.1.66:8000/google4.xml"); 

       URLConnection connection = url.openConnection(); 
       HttpURLConnection httpConnection = (HttpURLConnection)connection; 
       int responseCode = httpConnection.getResponseCode(); 

       if (responseCode == HttpURLConnection.HTTP_OK) { 
         InputStream in = httpConnection.getInputStream();   
         DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
         DocumentBuilder db = dbf.newDocumentBuilder(); 

         // falls over here parsing the xml. 
         Document dom = db.parse(in);  
       } 
     } catch (ManyExceptions e) { 
     .... 
} 

एक्सएमएल कि त्रुटि पैदा करता है की एक cutdown संस्करण है:

<?xml version="1.0"?> 
<xml_api_reply version="1"> 
     <weather> 
      <forecast_information> 
        <city>Hamilton</city> 
      </forecast_information> 
     </weather> 
</xml_api_reply> 

स्टैकट्रेस है

इस कोड है कि मैं कोशिश करते हैं और फ़ाइल को पार्स करने का उपयोग कर रहा है:

11-20 06:17:24.416: WARN/System.err(406): org.xml.sax.SAXParseException: Unexpected end of document 
11-20 06:17:24.416: WARN/System.err(406):  at org.apache.harmony.xml.parsers.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:131) 
11-20 06:17:24.416: WARN/System.err(406):  at javax.xml.parsers.DocumentBuilder.parse(DocumentBuilder.java:110) 
11-20 06:17:24.426: WARN/System.err(406):  at com.dave.nzweather.WeatherApp.refreshForecast(WeatherApp.java:159) 
11-20 06:17:24.426: WARN/System.err(406):  at com.dave.nzweather.WeatherApp.onCreate(WeatherApp.java:100) 
11-20 06:17:24.426: WARN/System.err(406):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047) 
11-20 06:17:24.438: WARN/System.err(406):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627) 
11-20 06:17:24.438: WARN/System.err(406):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679) 
11-20 06:17:24.446: WARN/System.err(406):  at android.app.ActivityThread.access$2300(ActivityThread.java:125) 
11-20 06:17:24.446: WARN/System.err(406):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033) 
11-20 06:17:24.456: WARN/System.err(406):  at android.os.Handler.dispatchMessage(Handler.java:99) 
11-20 06:17:24.456: WARN/System.err(406):  at android.os.Looper.loop(Looper.java:123) 
11-20 06:17:24.456: WARN/System.err(406):  at android.app.ActivityThread.main(ActivityThread.java:4627) 
11-20 06:17:24.466: WARN/System.err(406):  at java.lang.reflect.Method.invokeNative(Native Method) 
11-20 06:17:24.466: WARN/System.err(406):  at java.lang.reflect.Method.invoke(Method.java:521) 
11-20 06:17:24.466: WARN/System.err(406):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868) 
11-20 06:17:24.476: WARN/System.err(406):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626) 
11-20 06:17:24.476: WARN/System.err(406):  at dalvik.system.NativeStart.main(Native Method) 
11-20 06:17:24.486: WARN/ROGER(406): org.xml.sax.SAXParseException: Unexpected end of document 

ब्रेवटी के हित में, मैंने मूल एक्सएमएल शामिल नहीं किया है, लेकिन यह केवल मानक वजन है googles फ़ीड से er xml।

मैंने कुछ पूरी तरह से अलग एक्सएमएल फाइलों की कोशिश की है, (http://www.ibm.com/developerworks/xml/library/x-android/ से नमूना समेत) और वे सभी एक ही त्रुटि देते हैं। (जब वे उन्हें ऑनलाइन एक्सएमएल वैधकर्ता के माध्यम से चलाते हैं तो वे सभी भी मान्य होते हैं)।

इससे मुझे लगता है कि यह xml के साथ कोई समस्या नहीं है, बल्कि इसके बजाय मैं इसे पार्सर में कैसे खिला रहा हूं।

चीयर्स

डेव Smylie

+0

क्या आपने पहले पूरी फ़ाइल में पढ़ने की कोशिश की है? मुझे याद है कि बहुत समय पहले ऐसा कोई मुद्दा है, शायद यह मदद करता है। –

+0

मुझे ऐसा लगता है - मैं android.util.log के माध्यम से पुनर्प्राप्त फ़ाइल को डंप कर रहा हूं और यह वहां पूरी फ़ाइल दिखा रहा है। हालांकि, मैं उस स्ट्रिंगबफर में इनपुटस्ट्रीम चला रहा हूं, इसलिए यह संभव है कि लॉग पूरी तरह से समाप्त हो रही स्ट्रीम हो रही है, जहां पार्स() को अधूरा स्ट्रीम मिल रहा है .... मैं देखता हूं कि मैं इसे स्ट्रिंगबफर में बदल सकता हूं या नहीं पार्स कि ... –

उत्तर

3

अपने कोड को देखते हुए ऐसा लगता है कि आप अपने नेटवर्क पर एक कंप्यूटर बंद फ़ाइल लाने के लिए कोशिश कर रहे हैं। क्या आपने ब्राउज़र में उस यूआरएल को खोलने की कोशिश की है यह जांचने के लिए कि क्या यह वास्तव में एक्सएमएल फाइल भेज रहा है?

वैकल्पिक रूप से आप वायरसर्क के साथ भी जांच सकते हैं कि आपके फोन का क्या जवाब है। मेरा अनुमान है कि आपको बस XML दस्तावेज़ वापस नहीं मिलता है लेकिन 404 त्रुटि पृष्ठ मिलता है।

+0

मैंने मूल रूप से सोचा था कि नेटवर्क समस्याएं समस्या हो सकती हैं, इसलिए अब मैं इसे स्थानीय वेबसर्वर से पुनर्प्राप्त कर रहा हूं। मैं सर्वर लॉग में अनुरोध ठीक से देख सकता हूं और मैंने एंड्रॉइड.यूटिल.लॉग के माध्यम से ग्रहण करने के लिए पुनर्प्राप्त xml फ़ाइल की सामग्री को डंप कर दिया है, इसलिए मुझे पूरा यकीन है कि यह फ़ाइल ठीक है। । । –

+0

@ डेव स्माइली: समस्या क्या थी? –

+1

मुझे अभी भी यकीन नहीं है - मुझे संदेह है कि इनपुट स्ट्रीम जो मैं पार्स में जा रहा था() पूरी तरह से दस्तावेज़ को पुनर्प्राप्त नहीं कर रहा था। (भले ही मैंने इनपुट स्ट्रीम को एक स्ट्रिंग में परिवर्तित कर दिया और इसे लॉग में डाला, यह पूरा दस्तावेज़ दिखाएगा - इसलिए संभवतया इनपुट स्ट्रीम फ्लश नहीं कर रहा था .... वैसे भी, जैसे ही मैंने बस पार्स() को यूरी पास किया और यह समस्या को दूर करने के लिए दस्तावेज़ को लाने दें। –

4

(एक तरह से) हल ...

मैंने देखा sax.parser भी (इनपुट स्ट्रीम के बजाय) सीधे एक uri में ले सकता है।

जैसे ही मैंने कोशिश की है कि, यह ठीक पार्स, और कोड था एक पूरी बहुत छोटी =)

मदद के लिए धन्यवाद।

String weatherFeed = "http://192.168.1.66:8000/google.xml"; 
    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document dom = db.parse(weatherFeed); 
3

आपकी समस्या एन्कोडिंग मुद्दे की वजह से हो सकता है।

नीचे दिए गए यूटीएफ -8 एन्कोडिंग के साथ एक ByteArrayInputStream के माध्यम से अपना इनपुटस्ट्रीम बनाने का प्रयास करें और देखें कि यह काम करता है या नहीं। यह, (नीचे), जब मुझे एक्सएमएल का स्ट्रिंग था, तो इसका उपयोग करना था, लेकिन यह अभी भी आपके द्वारा उपयोग किए जा रहे इनपुटस्ट्रीम के माध्यम से एक मुद्दा हो सकता है।

String sData = "..Your XML in here.."; 
DocumentBuilder db = dbf.newDocumentBuilder(); 
InputStream is = new ByteArrayInputStream(sData.getBytes("UTF-8")); 
Document doc = db.parse(is); 

मतलब यह है कि आपके XML है UTF-8 एन्कोडिंग इस

<?xml version="1.0" encoding="UTF-8" ?> 

की तरह निर्दिष्ट नहीं तो आप सुनिश्चित करें कि आपके एन्कोडिंग अपने InputStream में परिभाषित अपने एक्सएमएल में परिभाषित किया गया है कि के रूप में ही है बनाना चाहिए है।

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