Saxparser على Android: نهاية غير متوقعة من استثناء الوثيقة

StackOverflow https://stackoverflow.com/questions/4239361

سؤال

أحصل على خطأ "SaxparseException: نهاية غير متوقعة من المستند" عند محاولة تحليل مستند XML على Android.

الوثيقة المعنية هي من واجهة برمجة تطبيقات Google Weather ، ولكن يبدو أنها ترمي نفس الخطأ بغض النظر عن ملف XML المعني (طالما أن XML صالحة) لذلك أظن أنه يمثل مشكلة في مقاربي ، بدلاً من XML.

يتم ذلك كتمرين تعليمي ، لذلك ربما أتجاهل (آمل) شيئًا واضحًا =)

لقد قمت بتشغيل XML من خلال مدقق عبر الإنترنت ، ويعود بشكل جيد. (لا أستطيع أن أخبرني إذا كان صحيحًا لأنني لا أملك DTD ، لكنني لا أعتقد أنني بحاجة إلى DTD لتحليل 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) {
        .... 
} 

نسخة قطع من XML التي تنتج الخطأ هي:

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

stacktrace هو:

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

من مصلحة الإيجاز ، لم أقم بتضمين XML الأصلي ، ولكنه مجرد Weather XML من تغذية Google.

لقد جربت أيضًا بعض ملفات XML مختلفة تمامًا ، (بما في ذلك العينة من http://www.ibm.com/developerworks/xml/library/x-android/) وكلهم يعطون نفس الخطأ. (قاموا أيضًا بالتحقق من صحة وتشكل بشكل جيد عندما أقوم بتشغيلها من خلال مدقق XML عبر الإنترنت).

هذا يجعلني أعتقد أنها ليست مشكلة مع XML ، بل مع كيفية محاولة إطعامها في المحلل.

هتافات

ديف سميلي

هل كانت مفيدة؟

المحلول

بالنظر إلى الكود الخاص بك ، يبدو أنك تحاول جلب الملف على جهاز الكمبيوتر على شبكتك. هل حاولت فتح عنوان URL في المتصفح للتحقق مما إذا كان يتم إرسال ملف XML حقًا؟

بدلاً من ذلك ، يمكنك أيضًا التحقق من Wireshark ما هو الإجابة التي يحصل عليها هاتفك. أظن أنك ببساطة لا تحصل على مستند XML ولكن صفحة خطأ 404.

نصائح أخرى

حل (نوع) ...

رأيت 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);

قد تكون مشكلتك ناجمة عن مشكلة تشفير.

حاول إنشاء InputStream عبر bytearrayinputStream مع ترميز UTF-8 مثل أدناه ومعرفة ما إذا كان ذلك يعمل. هذا ، (أدناه) ، هو ما اضطررت إلى استخدامه عندما كان لدي سلسلة من XML ، ولكن قد لا تزال مشكلة عبر Inputestream التي تستخدمها.

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 هو نفسه المحدد في XML الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top