0

我有一个问题,我自己解决不了!

我想在我的应用程序上获取 RSS 提要,因此我将这个 Url 放入我的代码中,以便获取 xml 文件然后进行解析... Rss 提要

我成功地从 Url 中获取了 xml 数据,这是后台方法中 do 的返回字符串,但问题是当我进行解析时,xmlParser 方法中的情况都没有实现!以下是我的所有代码和 StackTrace:

MainActivity 类:

package com.example.testfeeds;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.protocol.HTTP;
import org.apache.http.util.EntityUtils;
import org.xmlpull.v1.XmlPullParser;
import org.xmlpull.v1.XmlPullParserException;
import org.xmlpull.v1.XmlPullParserFactory;

import android.net.Uri;
import android.os.AsyncTask;
import android.os.Bundle;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.util.Log;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.ListView;

@SuppressWarnings("unused")
public class MainActivity extends Activity {

    String name;
    Button getfeeds;
    ArrayList<NewsFeeds> feeds;
    ListView feedsList;
    ArrayAdapter<NewsFeeds> adapter;
    ProgressDialog progress ;



    @SuppressWarnings("null")
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        getfeeds = (Button) findViewById(R.id.button1);
        feedsList=(ListView) findViewById(R.id.listView1);


        progress = new ProgressDialog(this); 
        progress.setMessage("Loading .... "); 
        progress.setCancelable(false); 


        getfeeds.setOnClickListener(new View.OnClickListener() {

            @Override
            public void onClick(View v) {

            new GetFeeds().execute("http://yunn.yu.edu.jo/index.php?option=com_content&view=category&id=55&layout=blog&Itemid=104&format=feed&type=rss"); 

            }
        });

        feedsList.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> adapter, View view, int position,
                    long id) {

                NewsFeeds item = (NewsFeeds) adapter.getItemAtPosition(position);

                String url= item.getLink();

                Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse(url));

                startActivity(browserIntent);

            }
        });



    }

////////////////////////////////////////////////////////////////////////////

     class GetFeeds extends AsyncTask<String, Integer, String>{


         @Override
            protected void onPreExecute() {

                progress.show();
                super.onPreExecute();
            }

        @Override
        protected String doInBackground(String... arg0) {

            String xmlData = GetUrlBody(arg0[0]); 

            Log.d("msg","in doInBackground .. ");


            return xmlData ;
        }

        @Override
        protected void onProgressUpdate(Integer... values) {

            super.onProgressUpdate(values);
        }


        @Override
        protected void onPostExecute(String result) {
            super.onPostExecute(result);

            Log.d("msg","the result not null");

            ////--------------------------------------////

            //Log.d("msg",result);

            FileOutputStream makeXml = null ; //declare a file to store the incoming xml data.
            InputStream xmlFile = null; // declare an input stream to get the xml file.
            try {


                makeXml= openFileOutput("temp.xml", Context.MODE_PRIVATE);
                makeXml.write(result.getBytes());
                makeXml.flush();
                makeXml.close(); 

                xmlFile= openFileInput("temp.xml"); 

//              StringBuilder sb = new StringBuilder(); 
//              int a =0 ; 
//              while ((a=xmlFile.read())!=-1) {
//                   sb.append((char)a);
//                  
//              }
//              
//              
//              
//              Log.d("msg",sb.toString());


            } catch (IOException e) {


                e.printStackTrace();
            }

          ////--------------------------------------////


            XmlPullParserFactory pullParserFactory;

            try {
                pullParserFactory = XmlPullParserFactory.newInstance();
                XmlPullParser parser = pullParserFactory.newPullParser();
                    parser.setFeature(XmlPullParser.FEATURE_PROCESS_NAMESPACES, false);
                    parser.setInput(xmlFile, null);
                    parseXML(parser);
            } catch (XmlPullParserException e) {
                e.printStackTrace();
            } catch (IOException e) {

                e.printStackTrace();
            }


            progress.dismiss();

        }




     }


////////////////////////////////////////////////////////////////////////////

        String GetUrlBody (String Url ){

            Log.d("msg","in get url ..");

        HttpClient cli = new DefaultHttpClient(); 



        HttpGet g = new HttpGet(Url); 



        try{
        HttpResponse res = cli.execute(g);



        if(res.getStatusLine().getStatusCode() == 200){

            String s =
        EntityUtils.toString(res.getEntity(), HTTP.UTF_8); 

            return s; 

        }else {
            return "Not Found"; 
        }

        }catch(Exception exx){}


        return null; 
    }


////////////////////////////////////////////////////////////////////////////

        private void parseXML(XmlPullParser parser) throws XmlPullParserException,IOException
        {

            int eventType = parser.getEventType();
            NewsFeeds currentFeed = null; 
            // int i=0;

            while (eventType != XmlPullParser.END_DOCUMENT){

                String tagName = null;

                switch (eventType){

                //----------------------------------//
                case XmlPullParser.START_DOCUMENT: 
                    feeds = new ArrayList<NewsFeeds>();
                    adapter = new ArrayAdapter<NewsFeeds>(this,R.layout.list_view,R.id.listView1, feeds);
                    break;
               //----------------------------------//
                 case XmlPullParser.START_TAG:
                     tagName = parser.getName();
                     if (tagName == "item"){
                         currentFeed = new NewsFeeds();
                     } else if (currentFeed != null){
                         if (tagName == "title"){
                             currentFeed.title = parser.nextText();
                             Log.d("value",currentFeed.title);
                         } else if (tagName == "link"){
                            currentFeed.link = parser.nextText();
                            Log.d("value",currentFeed.link);
                         } else if (tagName == "pubDate"){
                             currentFeed.feedDate= parser.nextText();
                             Log.d("value",currentFeed.feedDate);
                         }
                     }
                     break;                     
               //----------------------------------//
                 case XmlPullParser.END_TAG:
                     tagName = parser.getName();
                     if (tagName.equalsIgnoreCase("item") && currentFeed != null){
                        feeds.add(currentFeed);
                     }

              //----------------------------------//

                  default : Log.d("error","non of the cases implemented!");

                     break;

                }// end-switch.

                ///Log.d("success",feeds.get(0).getTitle());
                eventType= parser.next();
                //i++;
            }// end-while.



        } //end xmlParser method.


////////////////////////////////////////////////////////////////////////////


} // end- MainActivity class.

新闻提要类:

package com.example.testfeeds;

public class NewsFeeds {

    String title;
    String link;
    String feedDate;

    public void setTitle(String title) {
        this.title = title;
    }


    public void setLink(String link) {
        this.link = link;
    }


    public void setFeedDate(String feedDate) {
        this.feedDate = feedDate;
    }


    public String getFeedDate() {
        return feedDate;
    }


    public String getTitle() {
        return title;
    }


    public String getLink() {
        return link;
    }


}

堆栈跟踪:

07-27 13:10:29.685: D/dalvikvm(9308): GC_EXTERNAL_ALLOC freed 783 objects / 56336 bytes in 424ms
07-27 13:13:40.009: D/msg(9308): in get url ..
07-27 13:14:05.304: D/dalvikvm(9308): GC_FOR_MALLOC freed 1803 objects / 94784 bytes in 351ms
07-27 13:14:05.475: D/msg(9308): in doInBackground .. 
07-27 13:14:05.564: D/msg(9308): the result not null
07-27 13:14:06.164: D/dalvikvm(9308): GC_FOR_MALLOC freed 460 objects / 920152 bytes in 241ms
07-27 13:14:06.864: D/error(9308): non of the cases implemented!
07-27 13:14:06.864: D/error(9308): non of the cases implemented!
07-27 13:14:06.864: D/error(9308): non of the cases implemented!
07-27 13:14:06.887: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.894: D/error(9308): non of the cases implemented!
07-27 13:14:06.915: D/error(9308): non of the cases implemented!
07-27 13:14:06.915: D/error(9308): non of the cases implemented!
07-27 13:14:06.935: D/error(9308): non of the cases implemented!
07-27 13:14:06.935: D/error(9308): non of the cases implemented!
07-27 13:14:06.944: D/error(9308): non of the cases implemented!
07-27 13:14:06.944: D/error(9308): non of the cases implemented!
07-27 13:14:06.984: D/error(9308): non of the cases implemented!
07-27 13:14:06.984: D/error(9308): non of the cases implemented!
07-27 13:14:06.994: D/error(9308): non of the cases implemented!
07-27 13:14:06.994: D/error(9308): non of the cases implemented!
07-27 13:14:07.007: D/error(9308): non of the cases implemented!
07-27 13:14:07.030: D/error(9308): non of the cases implemented!
07-27 13:14:07.034: D/error(9308): non of the cases implemented!
07-27 13:14:07.034: D/error(9308): non of the cases implemented!
07-27 13:14:07.055: D/error(9308): non of the cases implemented!
07-27 13:14:07.055: D/error(9308): non of the cases implemented!
07-27 13:14:07.055: D/error(9308): non of the cases implemented!
07-27 13:14:07.084: D/error(9308): non of the cases implemented!
07-27 13:14:07.084: D/error(9308): non of the cases implemented!
07-27 13:14:07.084: D/error(9308): non of the cases implemented!
07-27 13:14:07.104: D/error(9308): non of the cases implemented!
07-27 13:14:07.125: D/error(9308): non of the cases implemented!
07-27 13:14:07.125: D/error(9308): non of the cases implemented!
07-27 13:14:07.125: D/error(9308): non of the cases implemented!
07-27 13:14:07.148: D/error(9308): non of the cases implemented!
07-27 13:14:07.148: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.174: D/error(9308): non of the cases implemented!
07-27 13:14:07.197: D/error(9308): non of the cases implemented!
07-27 13:14:07.197: D/error(9308): non of the cases implemented!
07-27 13:14:07.197: D/error(9308): non of the cases implemented!
07-27 13:14:07.225: D/error(9308): non of the cases implemented!
07-27 13:14:07.225: D/error(9308): non of the cases implemented!
07-27 13:14:07.225: D/error(9308): non of the cases implemented!

以此类推..直到文档结束,为什么会出现解析错误?

4

1 回答 1

1

我认为 switch 语句工作正常,但你的代码还有其他问题。首先,您错过了break最后一个非默认情况下的声明:

              case XmlPullParser.END_TAG:
                 tagName = parser.getName();
                 if (tagName.equalsIgnoreCase("item") && currentFeed != null){
                    feeds.add(currentFeed);
                 }
                 //<---- here!

              default : Log.d("error","non of the cases implemented!");
                 break;

每次找到结束标记时都会运行该日志语句,这就是您获得所有这些日志消息的原因。

真正的问题是您正在与==而不是使用进行字符串比较.equals(),例如:

                 if (tagName == "item") { //<-- this will never be true  
                     currentFeed = new NewsFeeds();
                 }

将那些切换为"item".equals(tagName).

于 2013-07-27T13:47:18.813 回答