RSS 是一种站点内容聚合的格式。
它的名字是 Really Simple Syndication 的的简写。
RSS 是 XML 的一种。所有的 RSS 文档都遵循 XML 1.0 规范,该规范发布在 W3C 网站上。
RSS 用于连锁 Web 内容和元数据。RSS 0.91 是几种可用版本中最常用的一种。对于新的 RSS 提要,更好的办法是使用 2.0 版,因为这是现行的规范,而且如前所述,它与 0.91 向后兼容。
Dave Winer 编写了规范的 2.0 版。规范的修改可能变得难以使用,或者损害已有的应用程序,他有意识地避免了这种情况。Winer 总结了他的思想:“保持简单。这就是 RSS 的价值所在。任何稍微了解 HTML 的人都能够理解 RSS。这一点极其重要!”
该规范在 Creative Commons 许可下发布(请参阅参考资料)。这意味着您可以免费复制和分发该规范,并进行衍生工作,而且可以自由地用于商业工作。一个咨询委员会负责更新规范、推广规范和编写文档。
在一个 RSS 文档中,最外层是一个 <rss> 元素,这个元素必须规定 version 属性,该属性明确了本文档遵从何种 RSS 版本规范。如果一个 RSS 文档以这个规范来表示,那么它的 version 属性就必须是 2.0。
RSS 文件由一个 <rss> 元素及其子元素组成。<rss> 元素只有一个子元素 <channel>,除了频道内容本身之外,<channel> 还以项的形式包含表示频道元数据的元素 —— 比如 <title>、<link> 和 <description>。项通常是频道的主要部分,包含经常变化的内容。
频道一般有三个元素,提供关于频道本身的信息。下面是一个必须包含的频道 (channel) 元素的列表,每一个都有一个简单的描述、一个例子、应该出现的位置和更详细描述的链接地址。
下面是一个可选的频道 (channel) 元素的列表
<image> 是 <channel> 的一个可选子元素, 它本身包含了三个必须的和三个可选的子元素。
<image> 还有三个可选的子元素:
<cloud> 是 <channel>的一个可选子元素。
它指定一个可以支持 rssCloud 接口的 web 服务,rssCloud 接口可以在 HTTP-POST、XML-RPC 或 SOAP1.1 中实现。
它的目的是允许通过注册一个 cloud 来处理获得频道的更新通知,从而为 RSS feeds 实现一个轻量级的发布订阅协议。
<cloud domain="rpc.sys.com" port="80" path="/RPC2" registerProcedure="myCloud.rssPleaseNotify" protocol="xml-rpc" />
在这个例子中,为了请求频道通知,你需要发送一个 XML-RPC 消息到 rpc.sys.com 的 80 端口,路径为 /RPC2。调用的程序为 myCloud.rssPleaseNotify。
这个元素的详细说明和 rssCloud 接口说明请参阅 这里。
<ttl> <channel> 的一个可选子元素。
ttl 是 Time to live 的缩写,表示生存时间。它表示频道从源重新更新之前可以缓存的时间。这使得 rss 源可以被一个支持文件共享的网络所管理,例如 Gnutella。
例子: <ttl>60</ttl>
频道可以选择包含一个 <textInput> 子元素,它本身包含了四个必须的子元素。
使用 <textInput> 元素的目的看起来有些神秘。你可以用它提供一个搜索引擎输入框,或让读者提供反馈信息。许多聚合器忽略该元素。
一个频道可以包含许多<item>元素。一个项目可以代表一个"故事" ——比如说一份报纸或杂志上的故事;如果是这样的话,那么项目的描述则是故事的摘要,项目的链接则指向整个故事的链接位置。一个项目也可以本身是完整的,如果是这样的话,项目的描述就包含了文本(整体以 HTML格 式编码是可以的;参见 例子),而链接和标题可以省略。项目的所有元素都是可选的,但是至少要包含一个标题 (title) 或描述 (description)。
<item> 通常是提要中最重要的部分。每个项都可以关于某个 weblog、完整文档、电影评论、分类广告或者任何希望与频道连锁的内容的记录。频道中的其他元素可能不变,但项经常发生变化。
您可以有任意多个 <item>。以前的规范限值为 15 个项,如果要保持向后兼容这仍然是一个很好的上限。
每个项通常包含三个元素:
项还有其他一些可选的元素:
<source> 是 <item> 的一个可选子元素。
它的值是 item 所属 rss 频道的名称,从 title 衍生而来。它有一个必须包含的属性 url,该属性链接到XML序列化源。
<source url="http://www.tomalak.org/links2.xml">Tomalak's Realm</source>
该元素的作用是提高链接的声望,从而进一步推广新闻项目的源头。它可以用在聚合器的 Pos 命令中。当从聚合器中通过一个 webblog 编辑工具提交一个 item 时,<source> 应该能够被自动生成。
<enclosure> 是 <item> 的一个可选子元素。
它有三个必须的属性。url 属性表明 enclosure 的位置,length 属性表明它的字节大小,而 type 属性则指出它的标准 MIME 类型。这里的 url 必须为一个 http url。
<enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" length="12216320" type="audio/mpeg" />
它的 use-case 说明请参见 这里。
<category> 是 <item> 的一个可选子元素。
它有一个可选属性 domain,该属性是一个用来定义分类法的字符串。
该节点的值是一个斜杠分割的字符串,它用来表明在指定的分类法中的层次位置。处理器可以为分类的识别建立协定。以下是两个例子:
<category>Grateful Dead</category>
<category domain="http://www.fool.com/cusips">MSFT</category>
你可以根据需要为不同的域包含很多 <category> 元素,并且可以在相同域的不同部分拥有一个交叉引用的 item。
<pubDate> 是<item> 的一个可选子元素。
它的值是一个 日期,表明项目发布的时间。如果它是一个将来的日期,则聚合器在日期到达之前可以选择不显示该项目。
<pubDate>Sun, 19 May 2002 15:21:36 GMT</pubDate>
<guid> 是 <item> 的一个可选子元素。
guid 是 globally unique identifier 的缩写。它是一个可以唯一识别这个 <item> 的字符串。在发布之后,聚合器可以选择使用该字符串判断这个 <item> 是否是新的。
<guid>http://some.server.com/weblogItem3207</guid>
guid 没有特定的语法规则。聚合器必须将它们当作一个字符串来处理。生成具有唯一性的字符串 guid 取决于种子的源头。
如果 guid 元素有 isPermaLink 属性,并且值为真,解释器就会认为它是item的 permalink。permalink 一个可在 web 浏览器中打开的 url 链接,它指向 <item> 节点所描述的完整 item。 例如:
<guid isPermaLink="true">http://inessential.com/2002/09/01.php#a2</guid>
isPermaLink是可选属性,默认值为真。如果值为假,guid 将不会被认为是一个 url 或指向任何对象的 url。
<comments> 是 <item> 的一个可选子元素。
如果出现,它指向与 item 相关的评论的 url。
<comments>http://ekzemplo.com/entry/4403/comments</comments>
更多信息,请参阅 这里。
<author>是<item>的一个可选子元素。
它是 item 作者的电子邮件地址l。对于通过 rss 传播的报纸和杂志,作者可能是写该 item 所描述的文章的人。对于聚集型 webblogs,作者可能不是责任编辑或站长。对于个人维护的 webblog,忽略 <author> 节点是有意义的。
<author>lawyer@boyer.net (Lawyer Boyer)</author>
清单 1 是一个 RSS 2.0 文件的例子。注意,频道包含在 <rss version="2.0"> 中。这是一个非常基本的例子,说明了项和图像如何包含在频道中。所示的元素都是最常用的频道子元素。
清单 1. 示例 RSS 2.0 文件
<?xml version="1.0"?>
<rss version="2.0">
<channel>
<title>The channel's name goes here</title>
<link>http://www.urlofthechannel.com/</link>
<description>This channel is an example channel for an article.</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>The Future of content</title>
<link>http://www.itworld.com/nl/ecom_in_act/11122003/</link>
<description>The issue of people distributing and reusing digital media is a problem for many businesses. It may also be a hidden opportunity. Just as open source licensing has opened up new possibilities in the world of technology, it promises to do the same in the area of creative content.
</description>
</item>
<item>
<title>Online Music Services - Better than free?</title>
<link>http://www.itworld.com/nl/ecom_in_act/08202003/</link>
<description>More people than ever are downloading music from the Internet. Many use person-to-person file sharing programs like Kazaa to share and download music in MP3 format, paying nothing. This has made it difficult for companies to setup online music businesses. How can companies compete against free?
</description>
</item>
</channel>
</rss>
由于 RSS 的普及,出现了许多工具,使您能够基本上在任何环境中使用这些文件:
此外,许多内容管理和 weblog 工具也直接支持 RSS。多数 weblog 工具,包括 Movable Type、Blogger 和 Radio Userland 都支持 RSS。一些内容管理系统,包括 Zope 和 CityDesk 现在也支持它了。
RSS 2.0 有许多可选元素,包括多数频道都需要的那些元素。但是它还支持扩展性,因此您可以使用规范中没有的元素。不过,RSS 2.0 规范并没有花费多少时间定义如何实现扩展。关于扩展性,规范中总结为:“RSS 提要可以包含本页中没有描述的元素,只要这些元素定义在一个名称空间中。”
这就留下了很大的想像空间!所幸的是,规范中包含一个例子,您可以参考目前使用的几个例子。
基本的思想是您可以增加需要的标签 —— 但是,增加带有多种含义的元素太容易了。使用您的频道的人们可能并不知道某个标签是什么含义。比如,如果我要在一个频道中使用 <analog> 标签,它的含义就不很清楚。Web 专家可能认为这个标签指的是 Analog,它是最流行的 Web log 文件分析器。科幻迷可能认为这个标签是关于 Analog 的,一本经典的科幻杂志。音乐家可能认为它指的是流行的合成器类型,生物学家认为这是一种器官,电子工程师认为是一种电路。含糊性使人们很难理解标签的含义。
因此,RSS 允许您增加所喜欢的任何标签,但是要求必须和名称空间一起使用。这样有助于澄清标签的含义。
再回到 <analog> 的例子,我可能希望创建一组关于电子商务的标签,并让 <analog> 标签作为一个“e-business”元素。为此,我增加如下的名称空间:
xmlns:ebusiness="http:// www.lewingroup.com/ebusinessChannel" 这就创建了一个名为“ebusiness”的名称空间,并表明这个名称空间的文档在我的站点上。为了使用 <analog> 标签,我可以使用这种格式:<ebusiness:analog>。这样就能与其他类似的含义中区分开来,比如 <sciencefiction:analog> 或 <synthesizers:analog>。
关于扩展性,一个更实际的例子可以在 RSS 2.0 规范的示例文件中找到:
清单 2. RSS 2.0 规范示例文件中的名称空间
<?xml version="1.0"?>
<!-- RSS generated by Radio UserLand v8.0.5 on 9/30/2002; 4:00:00 AM Pacific -->
<rss version="2.0" xmlns:blogChannel="http://backend.userland.com/blogChannelModule">
<channel>
<title>Scripting News</title>
<link>http://www.scripting.com/</link>
<description>A weblog about scripting and stuff like that.</description>
<language>en-us</language>
<blogChannel:blogRoll>
http://radio.weblogs.com/0001015/userland/scriptingNewsLeftLinks.opml
</blogChannel:blogRoll>
<item>
<description>
Joshua Allen: <a href="http://www.netcrucible.com/ blog/2002/09/29.html#a243"> Who loves namespaces </a>
</description>
<pubDate>Sun, 29 Sep 2002 19:59:01 GMT</pubDate>
<guid>
http://scriptingnews.userland.com/ backissues/2002/09/29#When:12:59:01PM
</guid>
</item>
</channel>
</rss>
在这个例子中,定义了一个称为 blogChannel 的名称空间。它指向一个文档,该文档解释了几种常见于 weblog 的新元素的用法。其中之一是 <blogroll>。文档说明,blogroll 是 weblog 中的一个链接集合,指向与您的 weblog 内容相关的站点。
<blogChannel:blogRoll> 标签提供了用户或软件所需要的信息,知道 blogRoll 是一个定义在 blogChannel 名称空间中的元素,而且可以找到这个文档的位置。
同样,RSS 2.0 只对不属于规范的元素要求名称空间。所有的基本标签都假定在 RSS 2.0 名称空间中。这使得这种格式更容易使用,因为除非需要扩展 RSS,否则您完全不需要知道名称空间。
本文考察了 RSS 在内容连锁和聚合领域的重要性。文章主要讨论 RSS 2.0,因为这是最新的规范版本,而且正在迅速普及。本文也考察了处理 RSS 可以使用的工具,包括集聚器、验证程序和解析器。更多信息请参阅参考资料。