【问题标题】:Android Application Keeps Crashing at XMl parsingAndroid 应用程序在 XML 解析时不断崩溃
【发布时间】:2013-02-06 00:02:46
【问题描述】:

在调试模式下运行时,我的应用程序 LogCat 给了我这个输出:

我正在尝试解析从 HTTPGet 请求(字符串结果)接收到的 XML 文档,结果是字符串格式的 XML。只是不能让它输入字符串值来测试登录。

02-20 19:39:48.326:E/AndroidRuntime(774):致命异常:主要 02-20 19:39:48.326:E/AndroidRuntime(774):java.lang.ClassCastException: org.apache.harmony.xml.dom.ElementImpl 不能强制转换为 android.sax.Element 02-20 19:39:48.326: E/AndroidRuntime(774): 在 com.testingapp.MainActivity$startLogin.onPostExecute(MainActivity.java:112) 02-20 19:39:48.326: E/AndroidRuntime(774): 在 com.testingapp.MainActivity$startLogin.onPostExecute(MainActivity.java:1) 02-20 19:39:48.326: E/AndroidRuntime(774): 在 android.os.AsyncTask.finish(AsyncTask.java:631) 02-20 19:39:48.326: E/AndroidRuntime(774):在 android.os.AsyncTask.access$600(AsyncTask.java:177) 02-20 19:39:48.326:E/AndroidRuntime(774):在 android.os.AsyncTask$InternalHandler.handleMessage(AsyncTask.java:644) 02-20 19:39:48.326: E/AndroidRuntime(774): 在 android.os.Handler.dispatchMessage(Handler.java:99) 02-20 19:39:48.326:E/AndroidRuntime(774):在 android.os.Looper.loop(Looper.java:137) 02-20 19:39:48.326: E/AndroidRuntime(774):在 android.app.ActivityThread.main(ActivityThread.java:5039) 02-20 19:39:48.326:E/AndroidRuntime(774):在 java.lang.reflect.Method.invokeNative(Native Method) 02-20 19:39:48.326:E/AndroidRuntime(774):在 java.lang.reflect.Method.invoke(Method.java:511) 02-20 19:39:48.326: E/AndroidRuntime(774):在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793) 02-20 19:39:48.326: E/AndroidRuntime(774): 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560) 02-20 19:39:48.326:E/AndroidRuntime(774):在 dalvik.system.NativeStart.main(Native Method)

我能够将错误集中到我的 onPostExecute AsyncTask 中:

@Override
              protected void onPostExecute(String result) {

                int z = 0;  
                String xml = result;
                String KEY_ITEM = "Response";
                String KEY_SUCCESS = "Success";
                String KEY_FAIL = "Fail";
                String KEY_UID = "UID";

                  Document doc = getDomElement(xml);

                    if(xml != null)
                    {
                        NodeList nl = doc.getElementsByTagName(KEY_ITEM);
                        for (int i = 0; i < nl.getLength(); i++)
                        {   
                        Element e = (Element) nl.item(i);
                        String successString = getValue(e,KEY_SUCCESS);
                        String UIDString = getValue(e,KEY_UID);
                        String failString = getValue(e,KEY_FAIL);

                        if(failString.equals("Fail")){
                            int duration = Toast.LENGTH_LONG;
                            Toast toast = Toast.makeText(MainActivity.this, "Please check username and password.", duration);
                            toast.setGravity(Gravity.TOP|Gravity.RIGHT, 0, 0);
                            toast.show();
                        }
                        else{
                            if(successString.equals("Success")){
                                Intent intent = new Intent (MainActivity.this, HomeActivity.class);
                                startActivity(intent);
                                }
                            }
                        }
                    }
                    else
                    {
                        Toast toast = Toast.makeText(MainActivity.this, "No Connection to Retrieve Data.", Toast.LENGTH_LONG);
                        toast.show();
                    }
        }

我不明白我做错了什么?

【问题讨论】:

  • 似乎是 ClassCastException... 你能发布你的 XML 数据吗?
  • Success801
  • 以上是服务的输出。
  • 看起来您的导入错误。您应该导入.. org.apache.harmony.xml.dom.ElementImpl(或相关类)而不是 android.sax.Element。可以请您检查并确认吗?
  • 全部,使用:导入 javax.xml.parsers.DocumentBuilder;导入 javax.xml.parsers.DocumentBuilderFactory;导入 javax.xml.parsers.ParserConfigurationException;导入 org.apache.http.HttpEntity;导入 org.apache.http.HttpResponse;导入 org.apache.http.client.ClientProtocolException;导入 org.apache.http.client.methods.HttpGet;导入 org.apache.http.impl.client.DefaultHttpClient;导入 org.apache.http.util.EntityUtils;导入 org.w3c.dom.Document;导入 org.w3c.dom.Node;导入 org.w3c.dom.NodeList;导入 org.xml.sax.InputSource;导入 org.xml.sax.SAXException;

标签: android xml parsing xmlhttprequest


【解决方案1】:

问题来了…… 改变这个

public String getValue(Element item, String str) { 
    NodeList n = ((Document) item).getElementsByTagName(str);
    return getElementValue(n.item(0)); 
}

public String getValue(Element item, String str) { 
    NodeList n = item.getElementsByTagName(str);  // Removed Typecast
    return getElementValue(n.item(0)); 
}

您正在转换 Element.getElementsByTagName(str) 正在返回一个 NodeList 对象。 但是您将其转换为 Document 对象,因此出现 Class Cast Exception。

【讨论】:

  • 已经坚持了一段时间,这对我有很大帮助,谢谢!!
猜你喜欢
  • 1970-01-01
  • 2019-03-27
  • 2013-03-26
  • 2013-02-22
  • 2017-10-27
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多