Mako Shan

Mako 是一名密码朋克爱好者
这里是我记录生活和成长的地方

联系我的微信号
👏欢迎一起交流学习

使用ROME解析RSS

最近做一个项目,需要解析数据量很大RSS,所以深度整理类一下资料。

RSS标准

RSS标准比较混乱,主要有以下3个系列

  • RSS 0.9x / 2.0 : RSS技术诞生于1999年的网景公司(Netscape),其发布了一个0.9版本的规范。2001年,RSS技术标准的发展工作被Userland Software公司的戴夫 温那(Dave Winer)所接手。陆续发布了0.9x的系列版本。当W3C小组发布RSS 1.0后,Dave Winer不承认其有效性。并于2002年9月独自把RSS升级到了2.0版本(Really Simple Syndication),并交由哈佛大学Technology at Harvard Law进行维护。
  • RSS 1.0 : 在RSS发展过程中,为使RSS成为一个通用的规范,并进一步标准化。一个联合小组根据W3C新一代的Resource Description Framework (RDF) 对RSS进行了重新定义,发布了RSS 1.0版,并把RSS定义为“RDF Site Summary”。现在RSS 1.0版由W3C联合小组维护。
  • Atom : Atom是一个项目的名字,主要是开发一个新的博客摘要格式以解决目前RSS存在的问题(混乱的版本号,不是一个真正的开放标准,表示方法的不一致,定义贫乏等等)。

如何实现RSS

RSS标准虽然混乱,但是其本质都是XML文档。你可以只使用notepad, 按照某个RSS标准, 手写一个xml, 并提供给客户端。
现在也有许多开源项目来提供RSS的解决方案。
Rome:https://rome.dev.java.net/
RSSLibJ :http://enigmastation.com/rsslibj/
RSSLib4J: http://devzone.stealthp.org/cms/index.php?page=RSSLib4J
使用这些解决方案可以更方便的处理RSS.

用 ROME 实现 RSS 服务

ROME是一个基于Java的开源程序包。ROME提供了一组Atom/RSS工具类,以使得用Java可以更方便和快捷的来操作大部分Syndication格式数据。使用ROME的解析器对读取一个Feed的操作是非常简单的,解析器可以从一个网址、一个本地文件或文件流中读取转换数据。将RSS子项列表信息以表格的形式显示出关键的几项,如标题、链接地址、标题简介。同时,ROME可以直接操作SyndFeed来构造Feed数据,实现从一个存在的Feed地址里读取解析到再输出生成一个Feed的过程。更多信息请参考该项目主页: http://wiki.java.net/bin/view/Javawsxml/Rome

示例代码

import com.sun.syndication.feed.synd.SyndCategory;
import com.sun.syndication.feed.synd.SyndContent;
import com.sun.syndication.feed.synd.SyndEnclosure;
import com.sun.syndication.feed.synd.SyndEntry;
import com.sun.syndication.feed.synd.SyndFeed;
import com.sun.syndication.io.SyndFeedInput;
import com.sun.syndication.io.XmlReader;

public class TestParse {
 @Test
 public void parseRss() {
  String rss ="http://teahour.fm/feed.xml";
  try {
   URL url = new URL(rss);
   // 读取Rss源
   XmlReader reader = new XmlReader(url);
   System.out.println("Rss源的编码格式为:" + reader.getEncoding());
   SyndFeedInput input = new SyndFeedInput();
   // 得到SyndFeed对象,即得到Rss源里的所有信息
   SyndFeed feed = input.build(reader);
   // 得到Rss新闻中子项列表
   List entries = feed.getEntries();
   // 循环得到每个子项信息
   for (int i = 0; i < entries.size(); i++) {
    SyndEntry entry = (SyndEntry) entries.get(i);
    // 标题、连接地址、标题简介、时间是一个Rss源项最基本的组成部分
    System.out.println("标题:" + entry.getTitle());
    System.out.println("连接地址:" + entry.getLink());
    SyndContent description = entry.getDescription();
    System.out.println("标题简介:" + description.getValue());
    System.out.println("发布时间:" + entry.getPublishedDate());
    // 以下是Rss源可先的几个部分
    System.out.println("标题的作者:" + entry.getAuthor());
    // 此标题所属的范畴
    List categoryList = entry.getCategories();
    if (categoryList != null) {
     for (int m = 0; m < categoryList.size(); m++) {
      SyndCategory category = (SyndCategory) categoryList
        .get(m);
      System.out.println("此标题所属的范畴:" + category.getName());
     }
    }
    // 得到流媒体播放文件的信息列表
    List enclosureList = entry.getEnclosures();
    if (enclosureList != null) {
     for (int n = 0; n < enclosureList.size(); n++) {
      SyndEnclosure enclosure = (SyndEnclosure) enclosureList
        .get(n);
      System.out.println("流媒体播放文件:" + entry.getEnclosures());
     }
    }
   }
  } catch (Exception e) {
   e.printStackTrace();
  }
 }
}
8
Android获取当前系统时间
目录