How to Build a RSS reader for Android?

我怕爱的太早我们不能终老 提交于 2019-11-28 04:35:02

Check following link, It's open source RSS reader for Android, You can download code for reference

http://code.google.com/p/android-rss/

This is my first approach to RSS Reader, It's no so dynamic and has boilerplate code but worked well for myself.

Usage:

RssParser parser = new RssParser(feedUrl);
Log.i("LOG", "Description: " + parser.getItem(3).description); //4th item's description

Class:

package com.uncocoder.course.app.feed_reader;

import java.io.IOException;
import java.net.URL;
import java.util.ArrayList;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;
import org.xml.sax.Attributes;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;
import org.xml.sax.helpers.DefaultHandler;
import android.util.Log;


public class RssParser extends DefaultHandler {

    private StringBuilder   content;
    private boolean         inChannel;
    private boolean         inImage;
    private boolean         inItem;

    private ArrayList<Item> items   = new ArrayList<Item>();
    private Channel         channel = new Channel();

    private Item            lastItem;


    public RssParser(String url) {
        try {
            SAXParserFactory spf = SAXParserFactory.newInstance();
            SAXParser sp = spf.newSAXParser();
            XMLReader xr = sp.getXMLReader();
            URL sourceUrl = new URL(url);
            xr.setContentHandler(this);
            xr.parse(new InputSource(sourceUrl.openStream()));
        }
        catch (ParserConfigurationException e) {
            e.printStackTrace();
        }
        catch (SAXException e) {
            e.printStackTrace();
        }
        catch (IOException e) {
            e.printStackTrace();
        }
    }


    public class Item {

        public String title;
        public String description;
        public String link;
        public String category;
        public String pubDate;
        public String guid;
    }


    public class Channel {

        public String title;
        public String description;
        public String link;
        public String lastBuildDate;
        public String generator;
        public String imageUrl;
        public String imageTitle;
        public String imageLink;
        public String imageWidth;
        public String imageHeight;
        public String imageDescription;
        public String language;
        public String copyright;
        public String pubDate;
        public String category;
        public String ttl;
    }


    @Override
    public void startDocument() throws SAXException {
        Log.i("LOG", "StartDocument");
    }


    @Override
    public void endDocument() throws SAXException {
        Log.i("LOG", "EndDocument");
    }


    @Override
    public void startElement(String uri, String localName, String qName, Attributes atts) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = true;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = true;
        }

        if (localName.equalsIgnoreCase("item")) {
            lastItem = new Item();
            items.add(lastItem);
            inItem = true;
        }

        content = new StringBuilder();
    }


    @Override
    public void endElement(String uri, String localName, String qName) throws SAXException {
        if (localName.equalsIgnoreCase("image")) {
            inImage = false;
        }

        if (localName.equalsIgnoreCase("channel")) {
            inChannel = false;
        }

        if (localName.equalsIgnoreCase("item")) {
            inItem = false;
        }

        if (localName.equalsIgnoreCase("title")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.title = content.toString();
            } else if (inImage) {
                channel.imageTitle = content.toString();
            } else if (inChannel) {
                channel.title = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("description")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.description = content.toString();
            } else if (inImage) {
                channel.imageDescription = content.toString();
            } else if (inChannel) {
                channel.description = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("link")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.link = content.toString();
            } else if (inImage) {
                channel.imageLink = content.toString();
            } else if (inChannel) {
                channel.link = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("category")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.category = content.toString();
            } else if (inChannel) {
                channel.category = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("pubDate")) {
            if (content == null) {
                return;
            }

            if (inItem) {
                lastItem.pubDate = content.toString();
            } else if (inChannel) {
                channel.pubDate = content.toString();
            }

            content = null;
        }

        if (localName.equalsIgnoreCase("guid")) {
            if (content == null) {
                return;
            }

            lastItem.guid = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("url")) {
            if (content == null) {
                return;
            }

            channel.imageUrl = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("width")) {
            if (content == null) {
                return;
            }

            channel.imageWidth = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("height")) {
            if (content == null) {
                return;
            }

            channel.imageHeight = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("language")) {
            if (content == null) {
                return;
            }

            channel.language = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("copyright")) {
            if (content == null) {
                return;
            }

            channel.copyright = content.toString();
            content = null;
        }

        if (localName.equalsIgnoreCase("ttl")) {
            if (content == null) {
                return;
            }

            channel.ttl = content.toString();
            content = null;
        }
    }


    @Override
    public void characters(char[] ch, int start, int length) throws SAXException {
        if (content == null) {
            return;
        }

        content.append(ch, start, length);
    }


    public Item getItem(int index) {
        return items.get(index);
    }
}

There is a tutorial (including complete source code) on how to build an Android RSS reder here:

part 1 (complete application)

part 2 (application updated to parse image tags from desciption)

part 3 (application update with Android 3.0)

The tutorial uses SAX parser and includes a complete Android project that accesses an RSS feed and then displays the feed in a list view.

There still seems to be a lot of people interested in this - so if you are looking for an Android 3.0+ with fragments/async tasks etc, as well as complete application code, I have updated the posts again, and they can be found here!

You can download and check my project on google-play. This project is about some turkish sport channels feeds. Lots of channels are in one application.

You can check source code of project on github.

Parse this type of Rss Feeds easily using XmlPullParser

     public class RSSParser {

public static ArrayList<Pojo> getParserData(String Data){
    try {
        RSSXMLTag currentTag = null;
        ArrayList<Pojo> postDataList = new ArrayList<>();
        XmlPullParserFactory factory = XmlPullParserFactory
                .newInstance();
        factory.setNamespaceAware(true);
        XmlPullParser xpp = factory.newPullParser();
        xpp.setInput(new StringReader(Data));

        int eventType = xpp.getEventType();
        Pojo pdData = null;
        SimpleDateFormat dateFormat = new SimpleDateFormat(
                "EEEE, DD MMM yyyy ");
        while (eventType != XmlPullParser.END_DOCUMENT) {
            int i = 0;
            if (eventType == XmlPullParser.START_DOCUMENT) {

            } else if (eventType == XmlPullParser.START_TAG) {
                if (xpp.getName().equals("item")) {

                    pdData = new Pojo();

                    currentTag = RSSXMLTag.IGNORETAG;
                } else if (xpp.getName().equals("title")) {
                    currentTag = RSSXMLTag.TITLE;
                } else if (xpp.getName().equals("link")) {
                    currentTag = RSSXMLTag.LINK;
                } else if (xpp.getName().equals("pubDate")) {
                    currentTag = RSSXMLTag.DATE;
                } else if (xpp.getName().equals("creator")) {

                    currentTag = RSSXMLTag.CREATOR;
                } else if (xpp.getName().equals("category")) {
                    currentTag = RSSXMLTag.CATEGORY;
                } else if (xpp.getName().equals("description")) {
                    currentTag = RSSXMLTag.DESCRIPTION;
                }
            } else if (eventType == XmlPullParser.END_TAG) {
                if (xpp.getName().equals("item")) {
                    // format the data here, otherwise format data in
                    // Adapter
                    Date postDate = dateFormat.parse(pdData.postDate);
                    pdData.postDate = dateFormat.format(postDate);
                    postDataList.add(pdData);
                } else {
                    currentTag = RSSXMLTag.IGNORETAG;
                }
            } else if (eventType == XmlPullParser.TEXT) {
                String content = xpp.getText();
                content = content.trim();
                Log.d("debug", content);
                if (pdData != null) {
                    switch (currentTag) {
                        case TITLE:
                            if (content.length() != 0) {
                                if (pdData.postTitle != null) {
                                    pdData.postTitle += content;
                                } else {
                                    pdData.postTitle = content;
                                }
                            }
                            break;
                        case LINK:
                            if (content.length() != 0) {
                                if (pdData.postLink != null) {
                                    pdData.postLink += content;
                                } else {
                                    pdData.postLink = content;
                                }
                            }
                            break;
                        case DATE:
                            if (content.length() != 0) {
                                if (pdData.postDate != null) {
                                    pdData.postDate += content;
                                } else {
                                    pdData.postDate = content;
                                }
                            }
                            break;
                        case CATEGORY:
                            if (content.length() != 0) {
                                if (pdData.postCategory != null) {
                                    i = i + 1;
                                    if (i == 1) {
                                        pdData.postCategory = content;
                                    }
                                } else {
                                    i = i + 1;
                                    if (i == 1) {
                                        pdData.postCategory = content;
                                    }
                                }
                            }
                            break;
                        case DESCRIPTION:
                            if (content.length() != 0) {
                                if (pdData.postDescription != null) {
                                    String s = content;

                                    String string = s.substring(s.indexOf("src=\"") + 5, s.indexOf("\" class=\""));
                                    pdData.postDescription += string;
                                } else {
                                    String s = content;

                                    String string = s.substring(s.indexOf("src=\"") + 5, s.indexOf("\" class=\""));
                                    pdData.postDescription = string;
                                }
                            }
                            break;
                        case CREATOR:
                            if (content.length() != 0) {
                                if (pdData.postCreator != null) {
                                    pdData.postCreator += content;
                                } else {
                                    pdData.postCreator = content;
                                }
                            }
                            break;
                        default:
                            break;
                    }
                }
            }

            eventType = xpp.next();
        }
        return postDataList;
    }catch (Exception e){
        e.printStackTrace();
    }

    return null;
}

public enum RSSXMLTag {
    IGNORETAG, TITLE, LINK, DATE,CREATOR,CATEGORY, DESCRIPTION;
}


public class Pojo {


public String getPostTitle() {
    return postTitle;
}

public void setPostTitle(String postTitle) {
    this.postTitle = postTitle;
}

public String getPostLink() {
    return postLink;
}

public void setPostLink(String postLink) {
    this.postLink = postLink;
}

public String getPostDate() {
    return postDate;
}

public void setPostDate(String postDate) {
    this.postDate = postDate;
}

public String getPostCategory() {
    return postCategory;
}

public void setPostCategory(String postCategory) {
    this.postCategory = postCategory;
}

public String getPostDescription() {
    return postDescription;
}

public void setPostDescription(String postDescription) {
    this.postDescription = postDescription;
}

public String getPostCreator() {
    return postCreator;
}

public void setPostCreator(String postCreator) {
    this.postCreator = postCreator;
}

public String postTitle;

public String postLink;

public String postDate;

public String postCategory;

public String postDescription;
public String postCreator;
}


}
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!