网易新闻RSS阅读器

首先需要分析网易RSS订阅中心的网页布局情况。

网易RSS订阅中心:http://www.163.com/rss/

你会发现RSS文件由一个<channel>元素及其子元素组成,除了频道本身内容之外,<channel>还以项的形式包含表示频道元数据的元素。

其中频道下面主要的三个元素就是:

1.title:频道或提要的名称。

2.link:与该频道关联的WEB站点或者站点区域的URL。

3.description:简要介绍该频道是做什么的。

当然还有其他子元素是可选的,比如常用的有<image>,<language>,<copyright><pubDate>等.

下面我们编写的RSS阅读器是包含了四个元素,有titile,link,description,pubDate.

首先:我们创建新闻的实体类:

package com.example.rssview;

public class News {

private String title;//新闻标题

private String link;//新闻网址

private String description;//新闻描述

private String pubDate;//新闻发布时间

public News() {

}

public News(String title, String link, String description, String pubDate) {

this.title = title;

this.link = link;

this.description = description;

this.pubDate = pubDate;

}

public String getTitle() {

return title;

}

public void setTitle(String title) {

this.title = title;

}

public String getLink() {

return link;

}

public void setLink(String link) {

this.link = link;

}

public String getDescription() {

return description;

}

public void setDescription(String description) {

this.description = description;

}

public String getPubDate() {

return pubDate;

}

public void setPubDate(String pubDate) {

this.pubDate = pubDate;

}

}

上面是程序开发的第一步,完成实体类的创建

第二步:我们应该也可想而知,必须解析XML的有用数据,常用的解析XML的方法有三种:DOM解析,SAX解析,PULL解析

因为DOM解析必须读取所有的XML内容到内存里面,挺耗系统资源的所以,我推荐选择SAX解析,或者PULL解析。

这里我选择SAX解析方法具体代码如下:

package com.example.rssview;

import java.util.ArrayList;

import java.util.List;

import org.xml.sax.Attributes;

import org.xml.sax.SAXException;

import org.xml.sax.helpers.DefaultHandler;

import android.util.Log;

public class SAXParserHelper extends DefaultHandler {

private List<News> newsList;//保存解析的所有新闻数据

private News news;//单个新闻内容

private String nodeName;//判断是那个元素用

//获取所有新闻数据

public List<News> getNewsList() {

return newsList;

}

//开始解析XML文档

@Override

public void startDocument() throws SAXException {

newsList = new ArrayList<News>();

}

//结束解析XML文档

@Override

public void endDocument() throws SAXException {

// TODO Auto-generated method stub

super.endDocument();

}

//开始解析某个元素

@Override

public void startElement(String uri, String localName, String qName,

Attributes attributes) throws SAXException {

if (localName.equals("title")) {

news = new News();

}

this.nodeName = localName;

}

//结束解析某个元素

@Override

public void endElement(String uri, String localName, String qName)

throws SAXException {

if (localName.equals("item")) {

newsList.add(news);

// Log.i("SAXParserHelper", news.getTitle());

// Log.i("SAXParserHelper", news.getLink());

// Log.i("SAXParserHelper", news.getPubDate());

// Log.i("SAXParserHelper", news.getDescription());

}

}

//解析元素的文本内容

@Override

public void characters(char[] ch, int start, int length)

throws SAXException {

if ("title".equals(this.nodeName)) {

news.setTitle(String.valueOf(ch, start, length));

} else if ("link".equals(this.nodeName)) {

news.setLink(String.valueOf(ch, start, length));

} else if ("description".equals(this.nodeName)) {

news.setDescription(String.valueOf(ch, start, length));

} else if ("pubDate".equals(this.nodeName)) {

news.setPubDate(String.valueOf(ch, start, length));

}

}

}

代码就不用多解释了,相信备注已经些的非常的详细了,也提供了供外部获取解析数据的方法getNewsList();

第三步:当然是去Activity活动里面去编写主要的代码了

开始我们必须准备包含了listView控件的布局文件,然后在activity里面设置布局文件

当然你也可以直接继承ListActivity类,这样更方便编程

你也应该知道这是从网络读取网址获取XML数据,根据Android的编程原则,耗时的网络操作不应该在主线程中直接执行,因为这样会造成主线程的崩溃。

然而android给我们提供了一个异步处理的机制类AsyncTask只要自己写个类实现该类把耗时的任务放在doInBackground方法里面处理就可以了。

当我们获得网络数据后就会操作更新UI来显示解析的XML数据,这个时候就可以在AsyncTask的onPostExecute里面解决.

也许我们还应该分析一下AsyncTask的三个参数,第一个参数是传递进来的参数,比如我们下面会传入一个网址供AsyncTask解析获得XML数据,第二个参数就是进度显示单位我们常常设置为Integer,第三个参数就是doInBackground方法返回的数据供onPostExecute调用的数据,也就是onPostExecute的参数.

下面我们首先必须获得网络的XML。

URL url = null;//创建URL对象

String XmlSourceStr = null;//解析后的XML数据

try {

url = new URL(params[0]);//获取传递进来的网址资源

if (url != null) {

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();//打开链接

InputStreamReader isReader = new InputStreamReader(

conn.getInputStream(), "UTF-8");//读取数据到InputStreamReader对象中,并设置编码格式为UTF-8

BufferedReader br = new BufferedReader(isReader);//实例化bufferedReader

StringBuilder sb = new StringBuilder();

String line = null;

while ((line = br.readLine()) != null) {

sb.append(line);//读取XML数据到StringBuilder中

}

isReader.close();//关闭数据流

conn.disconnect();//关闭连接

XmlSourceStr = sb.toString();//读取StringBuilder数据到字符串中

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return XmlSourceStr;//返回解析的XML字符串数据

这个方法属于网络处理比较耗时,相信大家也就知道,应该写在doInBackground中

获取网络的XML数据后,下面就是解析XML的数据,上面已经提到过。我们使用的解析方式是SAX解析。代码如下:

SAXParserFactory factory = SAXParserFactory.newInstance();//创建SAXParserFactory实例

if (result != null) {

try {

SAXParser parser = factory.newSAXParser();//新建SAXParser解析类

XMLReader xmlReader = parser.getXMLReader();//创建XMLReader读取类

SAXParserHelper helper = new SAXParserHelper();//实例化SAX解析方法

xmlReader.setContentHandler(helper);//设置处理器

xmlReader.parse(new InputSource(new StringReader(result)));//读取需要处理的数据

newsList = helper.getNewsList();//获得处理的结果

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

上面的操作不属于网络因为灯会需要操作更新UI,所以代码写在onPostExecute中

下面我们用迭代器遍历处理的结果,当然需要判断获取了需要的结果没有,代码如下:

if (!newsList.isEmpty())

Iterator<News> it = newsList.iterator();

然后创建一个用于接受遍历结果的Map类 Map<String,Object> map=new HashMap<String,Object>();

而simpleAdapter的构造方法中接收的是一个List对象,而上面获取的每个map,也就只是单独的一个新闻,所以必须创建List<Map<String,Object>> newsList=new ArrayList<Map<String,Object>>();将每一条map新闻保存在newsList当中.

对于刚才说的simpleAdapter一般有一点android基础的应该都不陌生,没错他就是简单的适配器.等会将数据显示到listView上面可少不了他。

现在我们就来设置listView显示新闻,代码如下:

首先绑定listView界面

SimpleAdapter adapter=new SimpleAdapter(Context,list对象,布局文件,listView中数据项,listView中数据项对应的ID);

第一个参数并不陌生就是上下文了,简单说就是继承活动的类名.this。

第二个参数属于刚才获取所有新闻的newsList.

第三个参数就是listView要显示的布局文件样式R.layout.你的布局文件名.

第四个参数就是map.put方法中前面字符串的名称.

第五个参数就是第三个参数布局文件中用于显示新闻每个项的ID;

最后设置到listView中就可以了,具体代码如下:

if (!newsList.isEmpty()) {

Iterator<News> it = newsList.iterator();

while (it.hasNext()) {

News news = (News) it.next();

HashMap<String, Object> map = new HashMap<String, Object>();

map.put("title", news.getTitle());

map.put("pubDate", news.getPubDate());

Log.i("MainActivity", news.getTitle());

Log.i("MainActivity", news.getPubDate());

mData.add(map);

}

SimpleAdapter adapter = new SimpleAdapter(MainActivity.this,

mData, R.layout.list_item, new String[] { "title",

"pubDate" }, new int[] { R.id.title,

R.id.pubDate });

newsListView.setAdapter(adapter);

}

当然这里我并没有做显示新闻详细的内容显示功能,不过相信看懂上面的代码后,你们也知道设置显示新闻相信内容和获取上面的代码有异曲同工之妙了。

好了,简单的RSS阅读器就讲到这样。我的第一篇博文,虽然不尽完美,但也算是讲解程序的一个起点。

时间: 2024-08-14 11:48:18

网易新闻RSS阅读器的相关文章

对下载到RSS阅读器里订阅内容

网络推广方法有很多,RSS推广就是其中的一种,RSS订阅能够为网站增加访问量,这是众人皆知的事实.不过,如何推广RSS,让更多人知道并促使更多人订阅RSS,却是一个很大的问题.下面就有我给大家讲解一下什么事RSS推广,如何利用RSS进行网络推广. 首先来说说什么是RSS? RSS是在线共享内容的一种简单方式(也叫聚合内容,Really Simple Syndication).通常在时效性比较强的内容上使用RSS订阅能更快速获取信息.网站提供RSS输出,有利于让用户获取网站内容的最新信息.网络用户

RSS阅读器&amp;BT sync

①RSS阅读器? 答:RSS阅读器是一种软件或是说一个程序,这种软件可以自由读取RSS和Atom两种规范格式的文档,且这种读取RSS和Atom文档的软件有多个版本,由不同的人或公司开发,有着不同的名字. Really Simple Syndication “真正简单的聚合”就是RSS的英文原意.把新闻标题.摘要(Feed).内容按照用户的要求,“送”到用户的桌面就是RSS的目的. ②BT sync BT sync 是一个文件同步工具,让你在几台不同的设备之间,同步文件.

那些值得收藏的神奇的网站,使用RSS阅读器订阅喜欢的网站 --授人以鱼不如授人以渔

知识越是分享越是精通.姿势越学习越标准越熟练..咳咳..好邪恶...在分享自己的神器之际把自己淘宝的地方和大家共享,我觉得还是十分有必要的 一些神器的网站 包含放放面面,随机排序: 1.iPc.me    异次元软件世界  师出同门,分享有意思的东西,好软件,IT业界新闻,限免推荐,正版国内代购,推广各种优秀实用软件.网络资源. 2.On HAX 软钥  On HAX是我最喜爱的网站之一,软件xx工具和Serial聚集地.笔者在这上面淘到东西还真不少,小红伞Pro.Revo Uninstalle

SAX实现的简易RSS阅读器

RSS RSS是简易信息聚合,用户可以订阅多个RSS源,从而在不打开网站页面的情况下阅读RSS输出的网站内容. 一个RSS文件就是一段规范的XML数据,如:http://sse.tongji.edu.cn/SSEMainRSS.aspx SAX与DOM SAX(Simple API for XML)是一个事件驱动的顺序访问XML解析API.不同于DOM(Document Object Model)将整个XML文档作为一个整体,SAX解析器按顺序解析XML文档的每个部分. DOM解析器在任何处理开

基于JSP的RSS阅读器

阅读器访问地址:http://easyrss.tk/,欢迎体验! 目录 一.    概述  二.    设计的基本概念和原理  1.    RSS与RSS阅读器概念 2.    阅读器实现原理 三.    设计方案 1.    架构设计 2.    数据库设计 3.    界面设计 4.    功能设计 5.    网络安全补充 四.    主要源代码  1.    视图部分 五.    阅读器使用说明 1.    注册与登录 2.    添加与管理RSS源 3.    阅读文章 概述 获得信息

RSS阅读器

RSS阅读器基本可以分为三类. 第一类大多数阅读器是运行在计算机桌面上的应用程序,通过所订阅网站的新闻供应,可自动.定时地更新新闻标题.在该类阅读器中,有Awasu.FeedDemon和RSSReader这三款流行的阅读器,都提供免费试用版和付费高级版 第二类新闻阅读器通常是内嵌于已在计算机中运行的应用程序中.例如,NewsGator内嵌在微软的Outlook中,所订阅的新闻标题位于Outlook的收件箱文件夹中.另外,Pluck内嵌在Internet Explorer浏览器中! 第三类则是在线

C#版简易RSS阅读器

C#版简易RSS阅读器.由VB版修改完成,感谢aowind的技术支持! 源代码: using System; using System.Drawing; using System.Collections; using System.ComponentModel; using System.Windows.Forms; using System.Data; using System.Xml; using System.IO; using System.Threading; namespace Yu

android rss阅读器开发一点小技巧

这几天一直在学习开发Rss阅读器,遇到一个很坑的问题,InputSource这里总是出错.弄了好久,终于让我找到一个解决方法----看代码: new Thread(){ @Override public void run() { try { URL url = new URL(RSS_URL); SAXParserFactory factory = SAXParserFactory.newInstance(); SAXParser parser = factory.newSAXParser();

PHP 实例 - AJAX RSS 阅读器

PHP 实例 - AJAX RSS 阅读器 RSS 阅读器用于阅读 RSS Feed. AJAX RSS 阅读器 在下面的实例中,我们将演示一个 RSS 阅读器,通过它,来自 RSS 的内容在网页不进行刷新的情况下被载入: 选择一个 RSS-feed:   读取 RSS 数据 RSS-feed 数据列表... 实例解释 - HTML 页面 当用户在上面的下拉列表中选择某个 RSS-feed 时,会执行名为 "showRSS()" 的函数.该函数由 "onchange"