跳转到主要内容

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

所有提交的信息确保安全。

  • 关闭 [x]

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

单击提交则表示您同意developerWorks 的条款和条件。 查看条款和条件.

所有提交的信息确保安全。

  • 关闭 [x]

使用 XML: 扩展 RSS 的能力

通过名称空间推进核心标准的演化

Benoit Marchal 的照片
Benoît Marchal 是一位顾问和作家,居住在比利时 Namur。他撰写了 XML by ExampleApplied XML SolutionsXML and the Enterprise。他创建了摄影播客 Declencheur

简介: 相对于它的受欢迎程度,RSS 标准惊人的简单,甚至可以说有限。RSS 没有假装能做很多东西,但被设计成能够通过 RSS 模块扩展。本文介绍了三种流行的 RSS 扩展,并说明如何设计您自己的扩展。

查看本系列更多内容

发布日期: 2006 年 9 月 18 日
级别: 中级
访问情况 : 2439 次浏览
评论: 


RSS 简单却并不有限

RSS 这个缩写词有很多含义:真正简单的联合(Really Simple Syndication)、丰富站点摘要(Rich Site Summary)、RDF 站点摘要( RDF Site Summary),可能还有其他的说法。实际上,RSS 就是在越来越多的网站(包括 developerWorks)上出现的那个桔红色按钮。

通过 RSS 提要可以订阅站点并在更新的时候得到通知。RSS 和电子邮件订阅有两个重要的区别:

  • RSS 需要特定的客户机,即 RSS 阅读器,不过将逐渐包括到 Web 浏览器中。
  • RSS 保护用户的秘密,与电子邮件不同,不用在站点上交换个人信息。

RSS 101

编写您的第一个 RSS 文件再简单不过了。根 RSS 元素称为 rss(非常合适)。后面紧跟着的是 channel 元素。

channel 元素首先包含关于新闻提要的描述。它至少要包括一个提要标题(title)、到相关网站的链接(link)和提要描述(description)。

其他元素是可选的。最常用的有提要语言(language)、发布日期(pubDate)、分类(category)和有效期(ttl),即频道缓存的分钟数。

经常还会包括 docs 元素,这个元素有点特殊docs 元素指向 RSS 文档,因此必须与每个 RSS 文档的值相同。

频道描述之后是一个 item 元素列表,每项代表一个新闻事件。

什么称得上新闻?这取决于站点和应用程序。对于一般的网站,项(item)可能表示页面的一次重要更新;对于播客(podcast),就是一段新的插话;对于网络监控应用程序,就是一次网络警报;对于论坛,就是一个新的帖子。

item 的内容与频道本身类似:titlelinkdescription。可能有更详细的日期、到多媒体内容的链接(enclosure)、来源和注释。

要在描述中包含 HTML 标记必须对其进行转义(通常使用 CDATA 节)。

值得注意的是 guid 元素,一个特殊的标识符。表示的时候,RSS 依靠它标识新的项。如果没有 GUID,阅读器必须比较项标题和内容来查找新的项。

清单 1 给出了 RSS 提要的一个例子:


清单 1. RSS 提要

<rss version="2.0">
  <channel>
    <title>Marchal.com</title>
    <link>http://www.marchal.com/</link>
    <description>Marchal's site.</description>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <language>en</language>
    <copyright>Copyright 2006, Benoit Marchal.</copyright>
    <pubDate>Fri, 30 Jun 2006 00:35:40 +0200</pubDate>
    <item>
      <title>Online photos</title>
      <link>http://www.marchal.com/en/photos</link>
      <description><![CDATA[<p>In 2002 I added a digital camera to my
         writer toolbox. I have used it to illustrate my articles and web
         sites.</p>
         <p>While I had some experience with film-based photos, I was
         new to digital images. Most of the things I knew were
         still valid, others I had to re-learn. There was
         a lot of new material as well. These pages summarize
         my findings.</p>]]></description>
      <pubDate>Fri, 30 Jun 2006 00:35:40 +0200</pubDate>
      <category>photo</category>
      <category>2002</category>
      <guid isPermaLink="false">photos</guid>
    </item>
  </channel>
</rss>

为了订阅提要,访问者需要一个 RSS 阅读器。简言之,阅读器定期下载 RSS 文件,如果发现新项就通知用户。

两种主流浏览器中内置了 RSS 阅读器:Firefox 1.5、Internet Explorer 7,Safari 也带有一个 RSS 阅读器。还有独立的阅读器,比如 NewsGator 的阅读器。此外,对于那些不喜欢安装新软件的人来说,可以通过聚合站点(如 Google Reader 和 NetVibes)阅读提要。甚至还有 RSS 和电子邮件之间的桥梁,如 Zookoda。

除了本节所述的之外,RSS 还定义了其他元素。完整的规范请参阅 参考资料

RSS 的能力

一句话,需要共享信息或者通知用户的宿主应用程序或网站能够从 RSS 提要中获益。事实上,RSS 的应用像野火一样蔓延得很快。

大量的应用也带来了一些问题。一些开发人员抱怨说不得不把概念硬塞进项中,而后者的局限性太大。为了解决这种局限性,RSS 2.0 被设计成了一种可扩展的语言。规则很简单:RSS 元素本身没有名称空间(与 RSS 0.92 保持向后兼容),但是允许开发人员在自己的名称空间增加元素来扩展 RSS。

如果标记具有名称空间,RSS 阅读器就会尝试根据名称空间识别出扩展来。如果成功就能处理这些元素。否则简单地忽略这些元素。

因此,RSS 提供了一个基础,可以建立更强大的应用程序。这种机制的优点在于,对阅读器来说扩展是可选的,不能处理某个扩展的阅读器仍然可以有效地处理核心 RSS 规范。

关于名称空间的说明

在继续后面的讨论之前,我先来揭穿关于名称空间的一些神话。奇怪的是,W3C 发布名称空间推荐标准七年之后,仍然存在着很多误解,而且不幸的是,还体现在一些 RSS 阅读器没有正确地实现标准。

名称空间是为需要在一个核心元素集上扩展的词汇表设计的,比如 RSS。具体而言,如果两个不同的扩展使用意义有别的同一个 XML 元素,名称空间可以防止名称冲突。

由于扩展是独立开发的,出现重复使用的名称只是一个时间问题。比如 “key” 这个词。它可能是数据库中的键,也可能是加密中的密钥。

为了消除歧义,名称空间 将元素名分为本地名和名称空间统一资源标识符(URI)。名称空间 URI 是扩展的惟一标识符。就其自身而言,本地名不能保证是惟一的,但本地名和名称空间 URI 结合起来可以做到。

我假设大部分读者都熟悉名称空间的语法。简单地说,xmlns 属性声明一个前缀并将其和名称空间 URI 联系起来。然后前缀又把名称空间 URI 和本地名联系起来。本地名和前缀之间使用冒号作为分隔符。清单 2 是一个例子:


清单 2. 名称空间声明

<dc:contributor xmlns:dc="http://purl.org/dc/elements/1.1/">
Marchal</dc:contributor>

实际上,名称空间有两点容易造成混乱:

  • 标识符是 URI 而且多数时候就是一个 URL。
  • 前缀和本地名的组合不能保证是惟一的。只有名称空间 URI 才能保证惟一性。

我将说明如何解决这两种错误。

首先,名称空间 URI。对于名称空间而言,URI 是严格的词汇表标识符而不是定义。因此,URI 指向何处没有关系。很多情况下,指向的源甚至不存在。

开发人员和用户虽然喜欢定义,但是他们认为在处理给定名称空间中的元素之前迫使应用程序下载文件是不能接受的。

很多应用程序在运行时仍然没有稳定的 Internet 连接。即便有 Internet 连接,下载文件会降低其速度,这一点也不总是允许的。况且如果网站(暂时)不能用怎么办?

此外,对于名称空间来说,需要的仅仅是一个标识符。

为什么用前缀呢?在每个标记上添上 URI 会增加文档的长度。于是引入了前缀作为缩短 URI 的一种办法。但是,前缀不能保证是惟一的(如果本地名不能保证这一点,有什么理由相信前缀会是惟一的,尤其是给出的前缀通常很短),所以必须引用 URI。

这就引出了 URI 的特殊性质,它们可作为惟一的标识符是因为大部分 URI 是 URL,而 URL 包含域名。只要使用自己拥有的域名定义名称空间就能保证惟一性,因为没有其他组织注册同一个域。

三种流行的扩展

为了具体了解扩展的工作原理,我们来看看三种常见的 RSS 扩展:

  • 用于元数据的 Dublin Core
  • 用于播客的 iTunes
  • 扩展了扩展的 Syndicated Photography

Dublin Core

Dublin Core 是一组元数据元素,最早是 RFC2413 定义的。Dublin Core 是资源搜索的最小元数据集。已经被用于 HTML(META 元素中)和各种 XML 词汇表。

Dublin Core 中的一些元素与 RSS 元素相同(比如 language),这是不可避免的,因为它是在 RSS 之前诞生的。但是这些重复也很有用,因为可以在频道或项上增加 Dublin Core 扩展。比如,RSS copyright 元素只能出现在频道层,但是可以把 Dublin Core rights 附加到每个项上。

Dublin Core 名称空间是 http://purl.org/dc/elements/1.1/

清单 3 中的例子在 RSS 中使用了 Dublin Core:


清单 3. RSS 中的 Dublin Core

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"> 
<channel>
   <title>Marchal</title>
   <link>http://www.marchal.com/</link>
   <description>Personal site.</description>
   <language>en</language>
   <item>>
      <title>Introduction</title>
      <link>http://www.marchal.com/en/</link>
      <description>Introduction to the site.</description>
      <dc:creator>Marchal</dc:creator>
      <dc:rights>Copyright 2001-2004 Marchal</dc:rights>
   </item>
</channel>
</rss>

Dublin Core 扩展表明即使与 RSS 类似的元素也有自身的价值,可以提供更多的选择。

iTunes Music Store

iTunes 通过其 iTunes Music Store 提供了对播客的直接访问。为了在存储中集成播客,iTunes 用名称空间 http://www.itunes.com/dtds/podcast-1.0.dtd 定义了一个扩展。

iTunes 扩展非常值得注意,因为:

  • 在定义不同的时候,它没有逃避重新定义与 RSS 类似的元素(比如 itunes:image,iTunes 需要 300×300 像素的图像,而 RSS 规定最大宽度为 144)。
  • 定义了新元素来增强用户的可访问性(比如 itunes:duration 提供了播客的播放时间,而 RSS 只提供了文件长度)。

清单 4 中的 RSS 例子使用了 iTunes 扩展:


清单 4. 带有 iTunes 扩展的 RSS 提要

<rss xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd"
    version="2.0">
  <channel>
    <title>Declencheur</title>
    <link>http://www.declencheur.com/</link>
    <description>Le podcast qui parle photos</description>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <language>fr</language>
    <copyright>? 2006, Benoit Marchal. Tous droits reserves.</copyright>
    <pubDate>Wed, 24 May 2006 16:19:39 +0200</pubDate>
    <itunes:author>Benoit Marchal</itunes:author>
    <itunes:image href="http://www.declencheur.com/clic/medias/2006/dsc_7478.jpg"/>
    <itunes:category text="Arts & Entertainment">
      <itunes:category text="Photography"/>
    </itunes:category>
    <itunes:category text="International">
      <itunes:category text="French"/>
      <itunes:category text="Belgian"/>
    </itunes:category>
    <item>
      <title>Histogramme</title>
      <link>http://www.declencheur.com/clic/archives/2006/05/histogramme-visuel</link>
      <description><![CDATA[<p><img alt="L'histogramme" height="225"
      width="150" align="right" class="photo illustrationright" 
       src="http://www.declencheur.com/clic/medias/2006/_dsc1808.jpg" />A mes yeux,
       l'histogramme est un des progres les plus remarquables de la photographie sur
       les dix dernieres annees. Un progres dans la precision de l'exposition au moins
       aussi important que la mesure matricielle en son temps.</p>
       <p>Les trois segments de l'episode sont (entre parentheses, le debut du
       segment concerne) :</p>
       <ol><li>(01:34) Elinchrom D-Lite, je suis particulierement enthousiaste
       par l'arrivee de ces flashes electroniques de studio. Mes premieres
       impressions.</li>
       <li>(07:40) Histogramme, le theme principal de l'episode. Un
       <a href="http://www.declencheur.com/clic/medias/2006/decl-2006-05-13.pdf"
       target="_blank">complement visuel</a> est disponible.</li>
       <li>(27:03) Vos commentaires, mes reactions : conseils pour la sauvegarde
       et precisions sur l'impression jet d'encre. Merci de votre
       soutien !</li></ol>
       <p>Les liens presentes dans l'episode :</p>
       <ul><li><a href="http://www.elinchrom.com"
       target="_blank">Elinchrom</a></li>
       <li><a href="http://www.foto-mueller.at" target="_blank">Foto
       Mueller</a><br clear="right" /></li></ul>]]></description>
      <pubDate>Mon, 15 May 2006 00:21:13 +0200</pubDate>
      <category>numerique</category>
      <category>technique</category>
      <enclosure length="34722926" type="audio/mpeg"
      url="http://www.declencheur.com/clic/medias/2006/decl-2006-05-14.mp3" />
      <guid isPermaLink="false">histogramme</guid>
      <itunes:duration>36:08</itunes:duration>
    </item>
  </channel>
</rss>

Syndicated Photography

Photocasting 意思是通过 RSS 提要分发照片。它与播客的原理相似,但传播的是图像而不是声音。初看起来,要用 RSS 提要分发照片,似乎使用 enclosure 元素就足够了。

聪明的照片浏览者首先下载缩略图,然后只下载用户请求的照片。但这不是 enclosure 的行为方式,因此 Pheed 只得定义包含这两个标记的扩展:photo:thumbnail(下载快的小图像)和 photo:imgsrc(完整的图像)。Pheed 是一个 RSS 聚合程序,为多媒体文档如图像提供了专门的支持。

有趣的是,照片也需要元数据,于是 Pheed 选择了 Dublin Core。因此,照片扩展建立在另一个扩展的基础上。避免了重复劳动因而提高了效率。

清单 5 是照片提要的一个例子。要注意其中声明了两个名称空间:


清单 5. 带有 Syndicated Photography 扩展的 RSS 提要
<?xml version="1.0" encoding="iso-8859-1"?>
<rss version="2.0" xmlns:photo="http://www.pheed.com/pheed/"
                   xmlns:dc="http://purl.org/dc/elements/1.1/"> 
<channel>
   <title>Fun with photos</title>
   <link>http://www.marchal.com/en/photos/</link>
   <description>Photo humor.</description>
   <language>en</language> 
   <item>
      <title>Journalist</title>
      <link>http://www.marchal.com/en/photos/humour</link>
      <description>He needs to fly</description>
      <dc:creator>Marchal</dc:creator>
      <dc:rights>Copyright 2004 Marchal</dc:rights>
      <dc:format>digital</dc:format>
      <dc:subject>Lego humor</dc:subject>
      <photo:imgsrc>
         http://www.marchal.com/en/photos/humour/phbd0001.jpg
      </photo:imgsrc>
      <photo:thumbnail>
         http://www.marchal.com/images/shared/thbd0001.jpg
      </photo:thumbnail>
   </item>
</channel>
</rss>

定义自己的扩展

如果发现希望 RSS 再增加一项功能该怎么办?

  1. 要确保还不存在您需要的扩展。不要重新发明轮子,这会给 RSS 阅读器带来痛苦。
  2. 如果发现仍然需要开发自己的扩展,一定要遵循正确使用名称空间的规则。
  3. 如果根本不合适,不要害怕重新定义已有的元素(比如 itunes:image 与 RSS 自己的 image 虽然类似但不相同)。超负荷使用元素只能造成混乱。

RSS 是一种灵活的格式,但更重要的是,它可以作为很多需要广播或窄播(narrowcast)的应用程序的基础。感谢扩展机制,它的用处简直太大了。


参考资料

关于作者

Benoit Marchal 的照片

Benoît Marchal 是一位顾问和作家,居住在比利时 Namur。他撰写了 XML by ExampleApplied XML SolutionsXML and the Enterprise。他创建了摄影播客 Declencheur

关于报告滥用的帮助

报告滥用

谢谢! 此内容已经标识给管理员注意。


关于报告滥用的帮助

报告滥用

报告滥用提交失败。 请稍后重试。


developerWorks:登录


需要一个 IBM ID?
忘记 IBM ID?


忘记密码?
更改您的密码

单击提交则表示您同意developerWorks 的条款和条件。 使用条款

 


当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在 developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。

请选择您的昵称:

当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。

昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。

(长度在 3 至 31 个字符之间)


单击提交则表示您同意developerWorks 的条款和条件。 使用条款.

 


为本文评分

评论

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML, Web development
ArticleID=160686
ArticleTitle=使用 XML: 扩展 RSS 的能力
publish-date=09182006
author1-email=bmarchal@pineapplesoft.com
author1-email-cc=dwxed@us.ibm.com

标签

Help
使用 搜索 文本框在 My developerWorks 中查找包含该标签的所有内容。

使用 滑动条 调节标签的数量。

热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。

我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。

使用搜索文本框在 My developerWorks 中查找包含该标签的所有内容。热门标签 显示了特定专区最受欢迎的标签(例如 Java technology,Linux,WebSphere)。我的标签 显示了特定专区您标记的标签(例如 Java technology,Linux,WebSphere)。