我正在尝试为我的博客制作一个RSSReader。我做了一个自己的处理程序。但是,当我尝试解析它时,它将无法正常工作

时间:2013-01-29 15:41:17

标签: java android xml xml-parsing

我正在尝试为我的博客制作RSSReader。我做了一个自己的处理程序。但是,当我尝试解析它时,它将不起作用

这是myHandler

import java.util.jar.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class myHandler extends DefaultHandler {

    final private String ENTRY = new String("entry");

    final private String TITLE = new String("title");

    final private String LINK = new String("link");

    final private String LINK_ATTR_HREF = new String("href");

    private boolean entryBoolean;

    private boolean titleBoolean;

    private String contentTitle;

    private Content myContent;

    public myHandler(Content content) {
        myContent = content;
    }

    @Override
    public void startDocument() throws SAXException {

        entryBoolean = false;
        titleBoolean = false;
        contentTitle = "";
    }

    @Override
    public void endDocument() throws SAXException {

    }

    public void startElement(String namespaceURI, String localName, String qName, Attributes atts) throws SAXException {

        if (localName.equalsIgnoreCase(this.ENTRY)) {
            this.entryBoolean = true;
        }
        else if (localName.equalsIgnoreCase(this.TITLE)) {
            this.titleBoolean = true;
        }
        else if (localName.equalsIgnoreCase(this.LINK)) {

            if (entryBoolean) {

                Log.i(myHandler.class.getSimpleName(), atts.getValue(this.LINK_ATTR_HREF));

                myContent.setUrl(atts.getValue(this.LINK_ATTR_HREF));
            }
        }
    }

    @Override
    public void endElement(String namespaceURI, String localName, String qName) throws SAXException {

        if (localName.equalsIgnoreCase(this.ENTRY)) {
            this.entryBoolean = false;
        }
        else if (localName.equalsIgnoreCase(this.TITLE)) {
            this.titleBoolean = false;

            if (this.entryBoolean) {

                Log.i(myHandler.class.getSimpleName(), this.contentTitle);

                myContent.setTitel(this.contentTitle);

                this.contentTitle = "";
            }
        }

    }

    @Override
    public void characters(char ch[], int start, int length) throws SAXException {

        String textBetween = new String(ch, start, length);

        if (this.entryBoolean) {
            // nur Title innerhalb des Entry Element werden ausgelesen
            if (this.titleBoolean) {
                this.contentTitle = this.contentTitle + textBetween;
            }

        }
    }
}



@Override
public void endElement(String namespaceURI, String localName, String qName)throws SAXException {

    if(localName.equalsIgnoreCase(this.ENTRY)){
        this.entryBoolean = false;
    }
    else if(localName.equalsIgnoreCase(this.TITLE)){
        this.titleBoolean = false;

        if(this.entryBoolean){

            Log.i(myHandler.class.getSimpleName(), this.contentTitle);

            myContent.setTitel(this.contentTitle);


            this.contentTitle = "";
        }
    }

}


@Override
public void characters(char ch[], int start, int length)throws SAXException {

    String textBetween = new String(ch, start, length);

    if(this.entryBoolean){
        //nur Title innerhalb des Entry Element werden ausgelesen
        if(this.titleBoolean){
            this.contentTitle = this.contentTitle + textBetween;
         }

        }
    }}

这是我的RSSMain.java

import java.io.IOException;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.DefaultHttpClient;
import org.xml.sax.SAXException;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class RSSMain extends Activity {

    private final String tag = RSSMain.class.getSimpleName();


    private final String URL_RSS = "http://www.heise.de/newsticker/heise-top-atom.xml";


    private ListView liste;


    private static Content myContent;


    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_rssmain);


        liste =(ListView)findViewById(R.id.feedListe);

        myContent = new Content();


        new ReadRssFeedTask(this).execute();


        liste.setOnItemClickListener(new AdapterView.OnItemClickListener() {

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


                Intent intent = new Intent(RSSMain.this,Anzeigen.class);

                intent.putExtra("URL", myContent.getUrl(position));
                startActivity(intent);
            }
        });
    }
    private class ReadRssFeedTask extends AsyncTask<Void,Void,Void> {


        private ProgressDialog dialog;


        private  HttpClient client;


        private HttpGet httpGet;


        private HttpResponse response;

        //Konstruktor
        public ReadRssFeedTask(Activity activity) {

            client = new DefaultHttpClient();

            httpGet = new HttpGet(URL_RSS);

            response = null;

            dialog = new ProgressDialog(activity);
        }


        protected void onPreExecute() {


            dialog.setTitle("Bitte warten!");
            dialog.setMessage("Der RSS Feed wird vom Server geladen.");
            dialog.show();
        }


        @Override
        protected Void doInBackground(Void... tmp){

            try {


                response = client.execute(httpGet);

                } catch (ClientProtocolException e) {
                Log.e(tag,"Falsches Protokol " + e.getMessage());
                } catch (IOException e) {
                Log.e(tag,"URL ist falsch, URL: "+URL_RSS + " " + e.getMessage());
            }


            if(response != null){


                StatusLine statusLine = response.getStatusLine();


                if ( statusLine.getStatusCode() == 200) {


                    HttpEntity entity = response.getEntity();


                    try {

                        SAXParserFactory spf = SAXParserFactory.newInstance();

                        SAXParser sp = null;

                        try {

                            sp = spf.newSAXParser();

                            } catch (ParserConfigurationException e) {
                            Log.e(tag, "Fehler: " + e.getMessage());
                            } catch (SAXException e) {
                            Log.e(tag, "Fehler im Handler: " + e.getMessage());
                        }


                        Handler myHandler = new Handler();

                        try {

                            sp.parse(entity.getContent(), myHandler);

                            } catch (SAXException e) {
                            Log.e(tag,"Fehler beim Parsen. Fehler: " + e.getMessage());
                            } catch (IOException e) {
                            Log.e(tag,"URL: "+ URL_RSS + " konnte nicht geöffnet werde! "+ e.getMessage());
                        }


                        } catch (IllegalStateException e) {
                        e.printStackTrace();
                    }


                    }else{
                    Log.i(RSSMain.class.getSimpleName(),"Der Server antwortet mit anderen Statuscode als 200. Statuscode: "+statusLine.getStatusCode());
                }
                }else{
                Log.i(RSSMain.class.getSimpleName(),"Keine Internetverbindung.");

            }

            return null;

        }

        @Override
        protected void onPostExecute(Void result){


            if (dialog.isShowing()) {
                dialog.dismiss();
            }



            liste.setAdapter(new ArrayAdapter<String>(RSSMain.this, android.R.layout.simple_list_item_1,myContent.getTitel()));

        }
    }
}

为什么解析器不起作用?我没有找到答案。

感谢您的帮助

0 个答案:

没有答案