在RSS概述中简单介绍了RSS,本节将为大家讲解RSS文件的解析,而又因为RSS是用XML编写的,所以这里就直接为大家讲解怎样解析XML文件。
一、XML文件解析方式
解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。
DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。
优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。
缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。
使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU)。
为了解决DOM解析存在的问题,就出现了SAX解析。其特点为:
优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如android,极力推荐使用SAX解析。
缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。
使用场合:机器有性能限制。
SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。
基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。
在SAX接口中,事件源是org.xml.sax包中的XMLReader,他通过parse()方法开始解析XML文档,并根据文档内容产生事件。而事件处理器则是org.xml.sax包中的ContentHandler、DTDHandler、ErrorHandler,以及EntityResolver这四个接口。他们分别处理事件源在解析过程中产生不同类的事件(其中DTDHandler为解析文档DTD时所用)。
SAX是一种占用内存少且解析速度快的解析器,它采用的是事件启动,它不需要解析完整个文档,而是按照内容顺序 看文档某个部分是否符合xml语法,如果符合就触发相应的事件,所谓的事件就是些回调方法(callback),这些方法定义在ContentHandler中,下面是其主要方法:
startDocument:当遇到文档的时候就触发这个事件,调用这个方法可以在其中做些预处理工作。
startElement(String namespaceURI,String localName,String qName,Attributes atts):当遇开始标签的时候就会触发这个方法。
endElement(String uri,String localName,String name):当遇到结束标签时触发这个事件,调用此法可以做些善后工作。
charachers(char [] ch,int start,int length):当遇到xml内容时触发这个方法,用new String(ch,start,length)可以接受内容。
二、建立pojo类
在解析之前,我们需要建立pojo类来对应RSS中的元素。首先是RSS feed,我们知道<channel> 元素用于描述RSS feed,但它不是描述RSS的重点,它下面的三个必须子元素<title><link><description>是描述feed的主要信息。因为我们在解析之前就事先获取了RSS地址,所以在这里我们就不需要建立一个RSS的link了。主要建立link,item列表以及description,因为是标题,所以把description就换成时间来表达,一般的RSS也是这样做的。如图:

下面是建立的RSSFeed:
Java代码
- public class RSSFeed
- {
- private String title = null;标题
- private String pubdate = null;发布日期
- private int itemcount = 0;
- private List<RSSItem> itemlist;声明一个RSSItem类型的泛型集合类List对象itemlist,用于描述列表 item
- public RSSFeed()
- {
- itemlist = new Vector(0); 构造函数初始化itemlist
- }
- public int addItem(RSSItem item)
- {
- itemlist.add(item);
- itemcount++;
- return itemcount;
- }
- public RSSItem getItem(int location)
- {
- return itemlist.get(location);
- }
- public List getAllItems()
- {
- return itemlist;
- }
- public List getAllItemsForListView(){
- List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
- int size = itemlist.size();
- for(int i=0;i<size;i++){
- HashMap<String, Object>item = new HashMap<String, Object>();
- item.put(RSSItem.TITLE, itemlist.get(i).getTitle());
- item.put(RSSItem.PUBDATE, itemlist.get(i).getPubDate());
- data.add(item);
- }
- return data;
- }
- int getItemCount()
- {
- return itemcount;
- }
- public void setTitle(String title)
- {
- this.title = title;
- }
- public void setPubDate(String pubdate)
- {
- this.pubdate = pubdate;
- }
- public String getTitle()
- {
- return title;
- }
- public String getPubDate()
- {
- return pubdate;
- }
- }
建立完RSSFeed类后,我们开始建立RSSItem:
Java代码
- public static final String TITLE="title";
- public static final String PUBDATE="pubdate";
- private String title = null;
- private String description = null;
- private String link = null;
- private String category = null;
- private String pubdate = null;
-
-
- public RSSItem()
- {
- }
- public void setTitle(String title)
- {
- this.title = title;
- }
- public void setDescription(String description)
- {
- this.description = description;
- }
- public void setLink(String link)
- {
- this.link = link;
- }
- public void setCategory(String category)
- {
- this.category = category;
- }
- public void setPubDate(String pubdate)
- {
- this.pubdate = pubdate;
- }
- public String getTitle()
- {
- return title;
- }
- public String getDescription()
- {
- return description;
- }
- public String getLink()
- {
- return link;
- }
- public String getCategory()
- {
- return category;
- }
- public String getPubDate()
- {
- return pubdate;
- }
- public String toString()
- {
- if (title.length() > 20)
- {
- return title.substring(0, 42) + "...";
- }
- return title;
- }
- }
三、XML解析
新建helper类RSSHandler,用于对rss进行xml解析,并将解析结果包装为RSSFeed和RSSItem对象,方便在UI界面中显示:
之后就可以按照一定的步骤来进行解析了,具体如下:
Java代码
- private RSSFeed getFeed(String urlString)
- {
- try
- {
- URL url = new URL(urlString);
- SAXParserFactory factory = SAXParserFactory.newInstance();
- SAXParser parser = factory.newSAXParser();
- XMLReader xmlreader = parser.getXMLReader();
-
- RSSHandler rssHandler = new RSSHandler();
- xmlreader.setContentHandler(rssHandler);
-
-
- InputSource is = new InputSource(url.openStream());
- xmlreader.parse(is);
-
- return rssHandler.getFeed();
- }
- catch (Exception ee)
- {
-
-
- return null;
- }
- }
关于如何解析RSS文件就先讲这些。后面一节我们将介绍怎样在列表里显示RSS内容,望大家继续关注。