通过rome实现RSS订阅

首先需要准备下环境(需要的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
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值