2010-04-26 11 views
5

मेरे पास एक अजीब समस्या है। मैं निम्न त्रुटि है कि एक शक्ति-पास का कारण बनता है प्राप्त करते हैं:पार्स अपवाद: लाइन 1 पर, कॉलम 0: कोई तत्व नहीं मिला

org.apache.harmony.xml.ExpatParser $ ParseException: पंक्ति 1, स्तंभ 0 पर: कोई तत्व org.apache.harmony.xml.ExpatParser में पाया .parseFragment (ExpatParser.java:508) org.apache.harmony.xml.ExpatParser.parseDocument (ExpatParser.java:467) org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:329) पर org.apache.harmony.xml.ExpatReader.parse (ExpatReader.java:286) पर

फोर्स क्लोज बटन पर क्लिक करने के बाद, गतिविधि निर्मित है और पार्स बिना किसी बाधा के पूरा करती है। मैं doInBackground अंदर निम्नलिखित कोड का टुकड़ा का उपयोग कर रहा एक AsyncTask की:

URL serverAddress = new URL(url[0]); 

HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 
connection.setReadTimeout(10000); 
connection.connect(); 

InputStream stream = connection.getInputStream(); 

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 

XMLReader xr = sp.getXMLReader(); 

xr.parse(new InputSource(stream)); // The line that throws the exception 

क्यों गतिविधि बलपूर्वक बंद करें और फिर तुरंत बाद किसी भी समस्याओं के बिना चला जाएगा? क्या BufferedInputStream कोई अलग होगा? मैं परेशान हूँ :(

अपना समय हर किसी के लिए धन्यवाद

अद्यतन:।। यह HttpURLConnection.getResponseCode() रिटर्न -1 हर बार, तो InputStream शायद ठीक से सेट नहीं किया जा रहा है पता चला है

+0

ऐसा लगता है कि स्ट्रीम शून्य है, क्या आप इसकी सामग्री को System.out.println पर कॉमन्स IOUtils के साथ डंप कर सकते हैं? – Jon

+0

क्या यह एक कॉपीपेस्ट है? 'HTTPURL कनेक्शन '! =' HttpURLConnection'। – BalusC

+0

वह एक टाइपो था, HttpURLConnection निश्चित। उसके लिए माफ़ करना। – jeffh

उत्तर

5
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection(); 
connection.setRequestMethod("GET"); 
connection.setDoOutput(true); 

ये पंक्तियां थोड़ा विषम हैं। क्या यह HTTPURLConnection या HttpURLConnection है? डिफ़ॉल्ट अनुरोध विधि पहले से ही GET है। setDoOutput(true) हालांकि इसे POST पर मजबूर करेगा।

मैं द्वारा

URLConnection connection = serverAddress.openConnection(); 

उन पंक्तियों के सभी की जगह और पुन: प्रयास था। ऐसा हो सकता है कि यह एक त्रुटि लौटा क्योंकि आपने POST को मजबूर किया और आउटपुट (अनुरोध निकाय) को कुछ भी नहीं लिखा। connection.connect() पहले से ही connection.getInputStream() द्वारा बुलाया गया तरीका है, इसलिए यह लाइन भी अनावश्यक है।

अद्यतन: परीक्षण उद्देश्यों के लिए निम्नलिखित कार्य करता है?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8")); 
for (String line; (line = reader.readLine()) != null;) { 
    System.out.println(line); 
} 
reader.close(); 
+0

धन्यवाद बलुस, बेहद जानकारीपूर्ण। परिवर्तन करेंगे और इसे एक शॉट देंगे। दिलचस्प क्या है, यह है कि अधिकांश समय एक्सएमएल बिना छेड़छाड़ के पार करता है। यह एक अपवाद फेंकने के लिए ड्रॉ का लगभग भाग्य है ... हालांकि ऐसा लगता है कि यह अक्सर समस्या होने के लिए पर्याप्त होता है। – jeffh

+0

परिवर्तन करने के बाद, बल-करीबी व्यवहार अभी भी मौजूद है। ऐसा लगता है जैसे पार्सर कुछ भी पार्स नहीं कर रहा है। इस के निचले भाग तक पहुंचने के लिए डीबगर के साथ हुकिंग। – jeffh

+0

अद्यतन के संबंध में, यह काम करना चाहिए, लेकिन मुझे लगता है कि System.util.Log का उपयोग एंड्रॉइड में System.out के बजाय किया जाता है। मूल पोस्ट का परीक्षण और अद्यतन करेगा। धन्यवाद! – jeffh

1

प्रति InputStream javadoc विधि तब तक अवरुद्ध हो जाएगी जब तक डेटा उपलब्ध न हो या ईओएफ का सामना करना पड़े। इसलिए, सॉकेट के दूसरी तरफ इसे बंद करने की आवश्यकता है - फिर inStream.read() कॉल वापस आ जाएगी।

यदि आप BufferedReader का उपयोग कर सकते हैं, तो आप कर सकते हैं लाइन-दर-रेखा तरीके से पढ़ें। readLine() विधि इस प्रकार वापस आ जाएगी HTTP प्रतिक्रिया से एक पंक्ति के रूप में पढ़ा जाता है।

+0

धन्यवाद रिंग बियरर, इसे और देखेंगे। – jeffh

1

एक संबंधित डिजाइन टिप्पणी पर, एक URL की सामग्री को लोड करके बंद एक गतिविधि के लिए मजबूर नहीं किया जाना चाहिए - मैं एक AsyncTask कार्यान्वयन में यह सब डाल सलाह देते हैं और रिपोर्ट या पुन: प्रयास आप जीयूआई धागे पर वापस आ रहे हैं के बाद।

+0

सहमत हुए। मूल पोस्ट में कोड स्निपेट एक AsyncTask के doInBackground में रहता है। – jeffh

2

मुझे नहीं पता कि आपने यह तय किया है, लेकिन मुझे एक ही समस्या थी। यह अजीब था, यह एमुलेटर में ठीक काम करेगा, लेकिन फिर फोन पर, यह हमेशा मुझे xr.parse() त्रुटि दे रहा था। यहां तक ​​कि जब मैंने InputStream मुद्रित किया, तो यह मुझे XML दस्तावेज़ का वैध आउटपुट देगा।ऐसा लगता है कि समस्या InputSource ऑब्जेक्ट

यहां बताया गया है कि मैंने इसे कैसे ठीक किया है: InputStream का उपयोग करने के बजाय InputSource बनाने के बजाय मैंने सीधे यूआरएल स्ट्रिंग से इनपुट स्रोत बनाया है।

InputSource a = new InputSource(url_string); 

जहां url_string केवल आपके यूआरएल के साथ एक स्ट्रिंग है। मुझसे मत पूछो कि यह क्यों काम करता है ... मुझे वास्तव में यह पसंद नहीं है, क्योंकि टाइमआउट की जांच करने के लिए कोई रास्ता नहीं है और ऐसा लगता है। लेकिन यह काम करता है, मुझे बताएं कि यह कैसे चला जाता है!

+0

आपकी प्रतिक्रिया के लिए धन्यवाद। मुझे नहीं लगता कि यह विशेष रूप से मेरे मामले के लिए काम करेगा, क्योंकि मुझे HttpURLConnection.setRequestProperty() का उपयोग करने की आवश्यकता है। मैंने प्रतिक्रिया कोड की जांच करके और कोड -1 है, तो कनेक्शन को पुनः प्रयास करके अस्थायी रूप से समस्या को ठीक कर दिया है। आपका इनपुट दूसरों की मदद कर सकता है हालांकि! – jeffh

0

मैं एक ही समस्या में भाग गया और इसका कोई अर्थ नहीं हो सका क्योंकि मैं सीधे इनपुट स्रोत से पार्स कर रहा था। जब मैंने एक्सएमएल पार्स से पहले एक स्ट्रिंग में परिणाम खींचने के लिए कोड को संशोधित किया, तो मुझे पता चला कि समस्या केवल एक गलत वर्तनी वाली वेब सेवा विधि नाम थी और उस सेवा द्वारा रिपोर्ट की गई त्रुटि संदेश हत्यारा था।

1

मुझे भी एक ही समस्या का सामना करना पड़ा। मैं इसकी सामग्री प्रिंट करने के लिए Scanner में InputStream का उपयोग कर रहा था। और फिर इसे XML पार्सर में पास करने का प्रयास कर रहा है।

समस्या यह थी कि मैं Scanner ऑब्जेक्ट को बंद नहीं कर रहा था। और पार्सर में Inputstream का उपयोग करना।

स्कैनर ऑब्जेक्ट को बंद करने के बाद, मैं इस मुद्दे से निपटने में सक्षम था।

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