使用 XML: 扩展 RSS 的能力

2024-03-28 00:58
文章标签 xml 使用 扩展 能力 rss

本文主要是介绍使用 XML: 扩展 RSS 的能力,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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

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)的应用程序的基础。感谢扩展机制,它的用处简直太大了。





回页首


参考资料

  • 参与论坛讨论。

  • RSS 简介(Vincent Lauria,developerWorks,2006 年 6 月):了解 RSS 和其他提要阅读器。还可以了解 RSS 如此流行的原因及其优点,以及提要阅读器的选择。

  • RSS 规范:可读性很强的规范。

  • Atom 1.0 Syndication Format 概述(James Snell,developerWorks,2005 年 6 月):Atom 可以作为 RSS 提要阅读器的替代品。

  • iTunes extensions:阅读这份简单的规范,了解准备 RSS 提要的提交过程和技术问题。

  • The Dublin Core:它是很多元数据标准的基础。

  • Pheed extension that builds on Dublin Core:了解 Pheeds —— 包含其他少数摄影相关元素的 RSS 文档。

  • IBM XML 1.1 认证:了解如何才能成为一名 IBM 认证的 XML 1.1 及相关技术的开发人员。

  • XML:developerWorks XML 专区提供了各种技术文章、技巧、教程、标准和 IBM 红皮书。

  • developerWorks 技术事件和网络广播:随时关注技术的最新进展。

 

关于作者

Benoit Marchal 的照片

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

这篇关于使用 XML: 扩展 RSS 的能力的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/853966

相关文章

使用Python将JSON,XML和YAML数据写入Excel文件

《使用Python将JSON,XML和YAML数据写入Excel文件》JSON、XML和YAML作为主流结构化数据格式,因其层次化表达能力和跨平台兼容性,已成为系统间数据交换的通用载体,本文将介绍如何... 目录如何使用python写入数据到Excel工作表用Python导入jsON数据到Excel工作表用

鸿蒙中@State的原理使用详解(HarmonyOS 5)

《鸿蒙中@State的原理使用详解(HarmonyOS5)》@State是HarmonyOSArkTS框架中用于管理组件状态的核心装饰器,其核心作用是实现数据驱动UI的响应式编程模式,本文给大家介绍... 目录一、@State在鸿蒙中是做什么的?二、@Spythontate的基本原理1. 依赖关系的收集2.

Python基础语法中defaultdict的使用小结

《Python基础语法中defaultdict的使用小结》Python的defaultdict是collections模块中提供的一种特殊的字典类型,它与普通的字典(dict)有着相似的功能,本文主要... 目录示例1示例2python的defaultdict是collections模块中提供的一种特殊的字

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

Java String字符串的常用使用方法

《JavaString字符串的常用使用方法》String是JDK提供的一个类,是引用类型,并不是基本的数据类型,String用于字符串操作,在之前学习c语言的时候,对于一些字符串,会初始化字符数组表... 目录一、什么是String二、如何定义一个String1. 用双引号定义2. 通过构造函数定义三、St

Pydantic中Optional 和Union类型的使用

《Pydantic中Optional和Union类型的使用》本文主要介绍了Pydantic中Optional和Union类型的使用,这两者在处理可选字段和多类型字段时尤为重要,文中通过示例代码介绍的... 目录简介Optional 类型Union 类型Optional 和 Union 的组合总结简介Pyd

Vue3使用router,params传参为空问题

《Vue3使用router,params传参为空问题》:本文主要介绍Vue3使用router,params传参为空问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录vue3使用China编程router,params传参为空1.使用query方式传参2.使用 Histo

使用Python自建轻量级的HTTP调试工具

《使用Python自建轻量级的HTTP调试工具》这篇文章主要为大家详细介绍了如何使用Python自建一个轻量级的HTTP调试工具,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录一、为什么需要自建工具二、核心功能设计三、技术选型四、分步实现五、进阶优化技巧六、使用示例七、性能对比八、扩展方向建

使用Python实现一键隐藏屏幕并锁定输入

《使用Python实现一键隐藏屏幕并锁定输入》本文主要介绍了使用Python编写一个一键隐藏屏幕并锁定输入的黑科技程序,能够在指定热键触发后立即遮挡屏幕,并禁止一切键盘鼠标输入,这样就再也不用担心自己... 目录1. 概述2. 功能亮点3.代码实现4.使用方法5. 展示效果6. 代码优化与拓展7. 总结1.

使用Python开发一个简单的本地图片服务器

《使用Python开发一个简单的本地图片服务器》本文介绍了如何结合wxPython构建的图形用户界面GUI和Python内建的Web服务器功能,在本地网络中搭建一个私人的,即开即用的网页相册,文中的示... 目录项目目标核心技术栈代码深度解析完整代码工作流程主要功能与优势潜在改进与思考运行结果总结你是否曾经