通过rome实现RSS订阅

论坛 期权论坛 脚本     
匿名技术用户   2021-1-5 18:02   11   0

首先需要准备下环境(需要的jar包):

rome-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323863)

jdom-1.0.jar (下载地址:http://download.csdn.net/detail/y397126710/4323870)

这两个包的版本必须一致,建议全部使用1.0版本。网上虽然有提供了很多下载地址,但是基本很多都是不能下载的,为方便我放自己的空间里方便大家下载。

至于RSS的详细的东西我就不赘述了,网上类似的文章描述的比我好的多了。


大家或许更想知道一个RSS订阅是怎么一回事,首先,RSS订阅需要一个RSS文件,RSS的格式是XML。必须符合XML 1.0规范。

<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Sample Feed (created with Rome)</title>
    <link>http://rome.dev.java.net</link>
    <description>This feed has been created using Rome (Java syndication utilities</description>
    <language>en-us</language>
    <image>
      <title>The image title goes here</title>
      <url>http://www.urlofthechannel.com/images/logo.gif</url>
      <link>http://www.urlofthechannel.com/</link>
    </image>
    <item>
      <title>Rome v1.0</title>
      <link>http://wiki.java.net/bin/view/Javawsxml/Rome01</link>
      <description>Initial release of Rome</description>
      <pubDate>Mon, 07 Jun 2004 16:00:00 GMT</pubDate>
      <guid>http://wiki.java.net/bin/view/Javawsxml/Rome01</guid>
      <dc:date>2004-06-07T16:00:00Z</dc:date>
    </item>
    <item>
      <title>Rome v2.0</title>
      <link>http://wiki.java.net/bin/view/Javawsxml/Rome02</link>
      <description>Bug fixes, <xml>XML</xml> minor API changes and some new features</description>
      <pubDate>Tue, 15 Jun 2004 16:00:00 GMT</pubDate>
      <guid>http://wiki.java.net/bin/view/Javawsxml/Rome02</guid>
      <dc:date>2004-06-15T16:00:00Z</dc:date>
    </item>
    <item>
      <title>Rome v3.0</title>
      <link>http://wiki.java.net/bin/view/Javawsxml/Rome03</link>
      <description><p>More Bug fixes, mor API changes, some new features and some Unit testing</p><p>For details check the <a href="Changes'>http://wiki.java.net/bin/view/Javawsxml/RomeChangesLog#RomeV03">Changes Log</a></p></description>
      <pubDate>Mon, 26 Jul 2004 16:00:00 GMT</pubDate>
      <guid>http://wiki.java.net/bin/view/Javawsxml/Rome03</guid>
      <dc:date>2004-07-26T16:00:00Z</dc:date>
    </item>
  </channel>
</rss>


RSS文件由一个 <channel> 元素及其子元素组成。除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。
项通常是频道的主要部分,包含经常变化的内容。


频道(channel)用<channel>表示

频道一般有三个元素,提供关于频道本身的信息:
<title>:频道或提要的名称。
<link>:与该频道关联的 Web 站点或者站点区域的 URL。
<description>:简要介绍该频道是做什么的。
许多频道子元素都是可选的。

常用的 <image> 元素包含三个必需的子元素:
<url>:表示该频道的 GIF、JPEG 或 PNG 图像的 URL。
<title>:图象的描述。当频道以 HTML 呈现时,用作 HTML <image> 标签的 ALT 属性。
<link>:站点的 URL。如果频道以 HTML 呈现,该图像作为到这个站点的链接。
<image> 还有三个可选的子元素:
<width>:数字,表示图象的像素宽度,最大值是 188,默认值为 88。
<height>:数字,表示图象的像素高度。最大值是 400,默认值为 31。
<description>:包含文本,在呈现时可以作为围绕着该图像形成的链接元素的 title 属性。

此外还可以使用许多其他可选的频道元素。多数都是不言自明的:

<language>:en-us
<copyright>:Copyright 2003, James Lewin
<managingEditor>:dan@spam_me.com (Dan Deletekey)
<webMaster>:dan@spam_me.com (Dan Deletekey)
<pubDate>:Sat, 15 Nov 2003 0:00:01 GMT
<lastBuildDate>:Sat, 15 Nov 2003 0:00:01 GMT
<category>:ebusiness
<generator>:Your CMS 2.0
<docs>:http://blogs.law.harvard.edu/tech/rss
<cloud>:允许进程注册为“cloud”,频道更新时通知它,为 RSS 提要实现了一种轻量级的发布-订阅协议。
<ttl>:存活时间 是一个数字,表示提要在刷新之前缓冲的分钟数。
<rating>:关于该频道的 PICS 评价。
<textInput>:定义可与频道一起显示的输入框。
<skipHours>:告诉聚集器哪些小时的更新可以忽略。
<skipDays>:告诉聚集器那一天的更新可以忽略。


摘要(feed)用<item>表示

每个摘要通常包含三个元素:
<title>:这是项的名称,在标准应用中被转换成 HTML 中的标题。
<link>:这是该项的 URL。title 通常作为一个链接,指向包含在 <link> 元素中的 URL
<description>:通常作为 link 中所指向的 URL 的摘要或者补充。

所有的元素都是可选的,但是一个项至少要么 包含一个 <title>,要么包含一个 <description>。
项还有其他一些可选的元素:
<author>:作者的 e-mail 地址。
<category>:支持有组织的记录。
<comments>:关于项的注释页的 URL。
<enclosure>:支持和该项有关的媒体对象。
<guid>:唯一与该项联系在一起的永久性链接。
<pubDate>:该项是什么时候发布的。
<source>:该项来自哪个 RSS 频道



下面就贴一点我自己写的demo吧。。。

1、发布一个RSS,通过Channel、Item类发布

public void ChannleItemXml() {
  DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd");
  Date date = new Date();

  Channel channel = new Channel("rss_2.0"); // 该type参数为固定格式
  channel.setTitle("test rome channel title");
  channel.setDescription("channel的描述");
  channel.setLink("http://hi.baidu.com/openj/rss");
  channel.setPubDate(date);
  channel.setEncoding("GBK");

  List items = new ArrayList();
  Item item = new Item();
  item.setAuthor("zhangwei");
  item.setTitle("item title");

  Description desc = new Description();
  desc.setType("item desc type");
  desc.setValue("item desc value");
  item.setDescription(desc);

  items.add(item);// 添加一个item

  Item item2 = new Item();
  item2.setAuthor("zhangwei");
  item2.setTitle("use rome to read rss");

  Description desc2 = new Description();
  desc2.setValue("you must import rome_1.0.jar & jdom.jar");
  item2.setDescription(desc2);
  Content content = new Content();
  content.setValue("rome是用来发布读取rss的工具,遵循rss标准的XML");
  item2.setContent(content);

  items.add(item2);// 添加一个item

  channel.setItems(items);

  WireFeedOutput out = new WireFeedOutput();
  try {
   // Channel继承与WireFeed
   System.out.println(out.outputString(channel));
  } catch (FeedException ex) {
   ex.printStackTrace();
  }
 }

2、发布一个RSS,通过SyndFeed、SyndEntry类发布

public void SyndFeedXml() {
  DateFormat dateParse = new SimpleDateFormat("yyyy-MM-dd");
  Date date = new Date();

  SyndFeed feed = new SyndFeedImpl();
  feed.setFeedType("rss_2.0"); // 该type参数为固定格式
  feed.setTitle("test rome channel title");
  feed.setDescription("channel的描述");
  feed.setLink("http://hi.baidu.com/openj/rss");
  feed.setPublishedDate(date);
  feed.setEncoding("GBK");
  List items = new ArrayList();
  SyndEntry entry = new SyndEntryImpl();
  entry.setAuthor("zhangwei");
  entry.setTitle("item title");

  SyndContent desc = new SyndContentImpl();
  desc.setType("item desc type");
  desc.setValue("item desc value");
  entry.setDescription(desc);

  items.add(entry);// 添加一个entry

  entry = new SyndEntryImpl();
  entry.setAuthor("zhangwei");
  entry.setTitle("use rome to read rss");

  desc = new SyndContentImpl();
  desc.setType("plain/text");
  desc.setValue("you must import rome_1.0.jar & jdom.jar");
  entry.setDescription(desc);

  items.add(entry);// 添加一个entry

  feed.setEntries(items);

  SyndFeedOutput out = new SyndFeedOutput();
  try {
   System.out.println(out.outputString(feed));
  } catch (FeedException ex) {
   ex.printStackTrace();
  }
 }

发布一个RSS的代码大概是这样的,这两种方式都可以的,不过我在实现的过程中,若是将XML的编码设置为UTF-8,那么出现中文就会有问题,修改为GBK就OK了,估计是和Tomcat设置的编码不一致吧,反正这个问题我一直没有找到具体的原因。。。。


3、读取外部的RSS

public void ReadFeedXml() {
  try {
   System.setProperty("http.proxyHost", "10.191.131.13");
   System.setProperty("http.proxyPort", "3128");
   String authStr = "account:password";
   String auth = "Basic " + Base64Encoder.encode(authStr.getBytes());
   URL feedurl = new URL("http://rss.sina.com.cn/news/marquee/ddt.xml"); // 指定rss位置
   URLConnection uc = feedurl.openConnection();
   // 设定代理
   uc.setRequestProperty("Proxy-Authorization", auth);
   uc.addRequestProperty("Referer", "localhost");
   SyndFeedInput input = new SyndFeedInput();
   SyndFeed feed = input.build(new XmlReader(uc));
   feed.setEncoding("GBK");
//   List entries = feed.getEntries();
//   for (int i = 0; i < entries.size(); i++) {
//    SyndEntry entry = (SyndEntry) entries.get(i);
//    System.out.print(entry.getTitle());
//    System.out.print(entry.getLink());
//   }
   
   SyndFeedOutput out = new SyndFeedOutput();
   try {
    System.out.println(out.outputString(feed));
   } catch (FeedException ex) {
    ex.printStackTrace();
   }
  } catch (Exception ex) {
   ex.printStackTrace();
  }
 }

其中注释掉的那段代码大家可以不用关注的,这样就可以读取一个外部的RSS了。。。。


其实我也是花了一天时间研究这一块,也研究的不是很深。因为我实在烦了网上各种没有的关于完成RSS的代码,因此自己才决定写这篇文章的。。。有什么不对的地方,高手看到希望指正。。。


对了,还少了一点,也是我一开始纠结的时间比较长的。就是如何把发布的RSS订阅订阅到像QQ邮箱、google等地的方法,其实上网查了好久,其实也蛮简单的。。

我能找到的就是这几个了,希望有找到的朋友帮忙补充下。。。。


1、添加订阅到Google

打开http://www.google.com/intl/zh-cn/webmasters/add.html,选择按钮样式并输入你的RSS地址,会生成一段代码,把这段代码加入到你的网页即可


2、添加订阅到鲜果

打开http://xianguo.com/tools/sub_button,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中


3、添加订阅到有道

打开http://reader.youdao.com/tools.html,选择按钮样式并输入你的RSS地址,把生成的代码加入到你的网页之中


4、订阅到QQ邮箱

我没有找到QQ邮箱添加订阅的代码生成页面,不过研究发现,你只要把链接http://mail.qq.com/cgi-bin/feed?u=http://domety.com/feed中的http://domety.com/feed改成你的RSS地址


下面是我做的一个例子,不过RSS源我链接的是新浪

<html>
<head>
 <title>RSS demo</title>
 <META http-equiv=content-type content="text/html; charset=GBK">
<META content="MSHTML 6.00.2462.0" name=GENERATOR></HEAD>
</head>
<body>
<a href="http://fusion.google.com/add?source=atgs&feedurl=http%3A//rss.sina.com.cn/news/marquee/ddt.xml"><img src="http://buttons.googlesyndication.com/fusion/add.gif" alt="Add to Google"></a><br />
  <a target="_blank" title="订阅到鲜果 RSS阅读器" href="http://xianguo.com/subscribe?url=http%3A%2F%2Frss.sina.com.cn%2Fnews%2Fmarquee%2Fddt.xml"><img src="http://static.xgres.com/static/images/sub/sub_XianGuo_02.gif" border="0" alt="鲜果阅读器订阅图标" /></a><br />
  
  <a href="http://mail.qq.com/cgi-bin/feed?u=http://rss.sina.com.cn/news/marquee/ddt.xml">订阅到QQ邮箱</a><br />
  <a target="_blank" href="http://reader.youdao.com/b.do?keyfrom=bookmarklet&url=http%3A%2F%2Frss.sina.com.cn%2Fnews%2Fmarquee%2Fddt.xml"><img src="http://reader.youdao.com/images/feed-btn-4.gif" border="0" alt="订阅到有道阅读" /></a>
</body>
</html>


后面有找到了两个

5、订阅到MSN

只要把连接http://my.msn.com/addtomymsn.armx?id=rss&amp;ut=http://rss.sina.com.cn/news/marquee/ddt.xml中的ut=后面的改为自己的RSS地址就可以了


6、订阅到雅虎

只要把连接http://add.my.yahoo.com/rss?url=http://rss.sina.com.cn/news/marquee/ddt.xml中的url=后面换成自己的RSS地址即可

分享到 :
0 人收藏
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

积分:7942463
帖子:1588486
精华:0
期权论坛 期权论坛
发布
内容

下载期权论坛手机APP