How to Build a RSS reader for Android?

后端 未结 5 1721
情歌与酒
情歌与酒 2020-12-08 01:00

I am new to android and i am trying to build a RSS reader for Android. I have built all the classes and XML files but its not giving the required output. Its just showing th

相关标签:
5条回答
  • 2020-12-08 01:41

    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;
    }
    
    
    }
    
    0 讨论(0)
  • 2020-12-08 01:52

    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!

    0 讨论(0)
  • 2020-12-08 01:55

    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);
        }
    }
    
    0 讨论(0)
  • 2020-12-08 01:56

    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.

    0 讨论(0)
  • 2020-12-08 02:03

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

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

    0 讨论(0)
提交回复
热议问题