在 Forge - 使用 Atom 进行聚合

作者:Reuven M. Lerner

在有组织犯罪的世界中,“辛迪加”是指一群共同工作的歹徒。在报纸的世界中,“辛迪加”向订阅者分发信息,使每个出版物都可以定制其接收的信息内容。漫画、新闻报道和评论专栏通常由辛迪加分发,从而为作者提供更大的曝光率,为读者提供更多内容。

在过去的几年中,Web 开发人员也开始使用术语“辛迪加”,既作动词又作名词。幸运的是,为了我们的安全,Web 上的联合发布与报纸的关系比与黑手党的关系更密切。但是,与有组织犯罪一样,许多人在公开争端中受到了伤害(尽管是用言语而不是枪支),导致了 Web 联合发布领域的分裂和相当多的尖刻。

这种分裂的结果是 Atom,这是一种新的联合发布格式,它与 RSS(丰富站点摘要或 RDF 站点摘要,取决于版本和您询问的对象)有很多共同之处。我认为,与任何版本的 RSS 相比,Atom 都具有许多优势,并且创建 Atom feed 的简单性使其成为优于 RSS 的显而易见的选择。 话虽如此,大多数 Weblog 产品都提供 RSS feed,这意味着这两个阵营目前可以愉快地共存。 了解两者如何工作也意味着您的组织可以根据您的需求决定采用一种或两种标准。

一些历史

正如我们上个月看到的那样,RSS 实际上是两种不同的格式,或者更准确地说,是两种不同的格式系列。 RSS 0.9x 和 RSS 2.0 来自同一系列,并展示了 Web 上联合发布的随时间推移的演变。 RSS 2.0 主要由 Userland、scripting.com 和(最近)哈佛大学的 Dave Winer 维护。 Winer 已将该标准的所有权移交给哈佛大学,但也声明 2.0 版将是最终版本。 然而,RSS 0.9x 和 RSS 2.0 的结合代表了一种广泛、稳定、广为人知且含义模糊的 Web 内容联合发布协议。

RSS 的一个单独分支,令人困惑地称为 RSS 1.0,使用万维网联盟 (W3C) 生成的资源开发框架 (RDF)。 RDF 旨在使计算机能够理解站点的内容,从而在站点之间建立连接,就像人们本能地一直做的那样。 RSS 1.0 生成的摘要与所有其他版本的 RSS 不兼容,它使用 RDF 生成站点内容的标准化描述。

RSS 1.0 使用 RSS 名称这一事实引起了极大的摩擦和敌意,许多人纷纷指责 Dave Winer、RSS 规范的模糊性以及 Atom 前身的拥护者。 最终,在 Tim Bray、Mark Pilgrim 和 Sam Ruby 等人的带领下,一些杰出人士得到了 Six Degrees(发布用于 Weblog 的 Movable Type 软件)等公司的支持,以制定一项规范,最初称为 PIE 和 Echo,旨在解决 RSS 的缺点。

Atom 的开发花费了一些时间,因为它涉及到理解和定义联合发布在当今万维网上的确切含义。 RSS 不再仅用于新闻站点(其最初的目标),还用于 Weblog 和非文本内容。 开发人员决定将国际化作为首要任务,这意味着应该可以使用任何语言生成联合发布 feed。 另一个优先事项是扩展的开发——也就是说,应该可以在不重新定义核心 Atom 规范的情况下向 Atom feed 添加新功能。

截至撰写本文时(2004 年 8 月中旬),Atom 规范现在以 0.3 版本存在,以及用于通过网络编辑内容的标准 API。 Atom 已开始被 IETF(互联网工程任务组,负责制定和发布互联网标准)标准化的过程,这意味着它正在成为一种普遍接受的标准,就像 TCP/IP、SMTP 或 HTTP 一样。 这无疑将导致那些等待 IETF 批准的组织对 Atom 产生更大的兴趣。

Atom 仍处于初期阶段,缺乏许多项目的公共规范,例如其扩展机制。 但到目前为止,其作者已经制定了一个标准,其复杂性与 RSS 0.9x 和 2.0 非常接近,以尽可能明确的方式编写,其中包括 Web 联合发布社区的许多成员,并提供了超越 Web 的联合发布愿景。

生成 Atom Feed

虽然 RSS 旨在总结新闻 feed 或 Weblog,但 Atom 的创建考虑了更通用的目的。 例如,工厂机器可以在 Atom 中生成状态报告,聚合器会显示那些发生故障的报告。 图书馆可以生成其最新馆藏的 Atom feed,智能聚合器会查找有关某些主题的书籍。 传真机可以被传真调制解调器取代,使用 Atom 将传真图像分发给适当的人员组。

您甚至可以使用 Atom feed 创建报纸出版系统,记者不是通过电子邮件发送他们的故事,而是在 Atom feed 上发布草稿。 每位编辑都会聚合来自其控制下的记者的 Atom feed,并在编辑完成后将其移动到传出的 Atom feed。 最终的 feed 将最终进入制作部门,在那里文本将被排版并准备好进行实际印刷。 因此,报纸的内容流将是许多 Atom feed 流入代表报纸本身的单个最终 feed。

如果您使用 Perl 或另一种存在 Atom 库的高级语言,则生成 Atom feed 非常简单。 例如,Perl 具有 XML::Atom 模块,可从 CPAN(综合 Perl 存档网络)获得。 我在运行 Fedora Core 2 和 Perl 5.8.3 的机器上安装 XML::Atom 时遇到了一些麻烦,但我通过在安装过程中忽略可选的 DateTime 模块来解决这个问题。 我不建议在生产环境中这样做。

虽然 XML::Atom 是总体的包名称,但创建 Atom feed 的程序实际上使用 XML::Atom::Feed 和 XML::Atom::Entry。 这是一个简短的 Perl 程序,它生成一个简单的 feed,部分基于 XML::Atom::Feed 的 perldoc 在线文档中的示例程序

#!/usr/bin/perl

use strict;
use diagnostics;
use warnings;

use XML::Atom::Feed;
use XML::Atom::Entry;

# Create a new Atom feed
my $feed = XML::Atom::Feed->new;
$feed->title('My Weblog');

my $entry;
# Create a first entry for the feed
$entry = XML::Atom::Entry->new;
$entry->title('First Post');
$entry->content('First Post Body');
$feed->add_entry($entry);

# Create a second entry for the feed
$entry = XML::Atom::Entry->new;
$entry->title('Second Post');
$entry->content('Second Post Body');
$feed->add_entry($entry);

# Now produce the XML output
my $atom_feed_xml = $feed->as_xml;

# Display the XML output
print $atom_feed_xml, "\n";

上面的程序生成以下 feed,我已经用额外的空格进行了格式化,以便于阅读

<?xml version="1.0"?>
<feed xmlns="http://purl.org/atom/ns#">
<title>
    My Weblog
</title>
<entry >
    <title>
    First Post
    </title>
    <content mode="xml">
    <default:div xmlns="http://www.w3.org/1999/xhtml">
        First Post Body
    </default:div>
    </content>
</entry>
<entry >
    <title>
    Second Post
    </title>
    <content mode="xml">
    <default:div xmlns="http://www.w3.org/1999/xhtml">
        Second Post Body
    </default:div>
    </content>
</entry>
</feed>

如您所见,我们创建了一个 XML::Atom::Feed 对象,其中包含一个或多个 XML::Atom::Entry 实例。 每个条目对象对应于 Atom feed 中的单个 <entry> 标记,而该标记又代表我们 Weblog 中的单个条目或我们工厂车间的单个消息。

Atom 规范指出,feed 可以包含许多属性和子元素,包括语言、Weblog 或站点的描述、版权信息以及有关始发站点的其他一般信息。 反过来,每个条目都有自己的一组元素,例如标题、创建时间的指示和摘要。 每个 Atom 元素还具有 MIME 类型,指示它包含的内容类型,很像 HTTP 响应和电子邮件附件。

当然,仅当您编写新的 Atom 驱动的应用程序,或者如果您正在向 Weblog 产品添加 Atom 功能时,才需要像上面的示例中那样创建 feed。 大多数 Weblog 产品现在都提供 Atom feed,无论是作为其标准发行版的一部分,还是通过插件或其他扩展机制。 例如,Blosxom Weblog 产品的 Atom feed 插件可以轻松地从 Weblog 添加此类 feed; 安装插件(通过将其放在插件目录中),任何有兴趣从相关 Weblog 接收 Atom feed 的人都可以这样做。

考虑到 Blosxom 是用 Perl 编写的,Perl 提供了用于处理 XML 的出色工具,并且该插件只需要总结和重写 Weblog 中最新条目的内容,因此这很容易实现,这不足为奇。 由于 Blosxom 使插件可以如此轻松地修改主页(以便宣传 Atom feed)并检索内容(通过插件 API),因此从该产品使用 Atom 可能会稍微容易一些。 鉴于大多数 Weblog 产品都是用高级语言编写的,例如 Perl、Python 或 PHP,因此在当前不存在 Atom feed 的地方添加 Atom feed 应该很容易。

解析 Atom Feed

要解析 Atom feed,无论是为了编写聚合器还是因为我们想要创建 Atom 驱动的应用程序,我们都有多种选择。 最简单的方法是继续使用 XML::Atom::Feed 来发现和检索 feed,例如

#!/usr/bin/perl

use strict;
use diagnostics;
use warnings;

use XML::Atom::Feed;

# Get the Atom feeds for www.diveintomark.org
my @uris =
    XML::Atom::Feed->find_feeds(
        "http://www.diveintomark.org/");

    # Print each Atom feed URI
    foreach my $uri (@uris)
    {
    print "uri = '$uri'\n";
    }

在上面的示例中,我们看到了打印的单个 URI。 现在我们知道 feed 在哪里,我们可以获取其中的链接列表,将这些链接转换为 XML

#!/usr/bin/perl

use strict;
use diagnostics;
use warnings;

use XML::Atom::Feed;

# Get an Atom feed
my @uris = XML::Atom::Feed->find_feeds("http://www.diveintomark.org/");

foreach my $uri (@uris)
{
my $feed = XML::Atom::Feed->new(URI->new($uri));

my @links = $feed->link();

foreach my $link (@links)
{
    my $link_xml = $link->as_xml();
    print "link = '$link_xml\n";
}
}

当然,我们不必生成或显示 XML; 我们可以解析链接信息,通过电子邮件将新链接发送给订阅者,将它们添加到数据库中,或者忽略那些不符合某些标准的链接。

由于 Atom feed 非常规范,并且由于它们使用 XML、Unicode 和 MIME 等互联网标准运行,因此我们可以确信我们的 feed 解析的内容可以以直接的方式处理。 我们可以将不同的内容类型分配给不同的处理程序,以不同的方式解析它们,甚至(如上面的报纸示例中)将它们放置到新的 feed 上,从而成为超级聚合器。

如果您有兴趣创建聚合器或了解如何使用 RSS 和 Atom 的不同版本,那么还值得看看 Mark Pilgrim 的 feed 聚合器。 它是用 Python 编写的,并且不断更新,这可能是用于处理联合发布 feed 的最佳文档化的开源引擎。

RSS 还是 Atom?

那么,您的网站(或 Weblog)应该在 RSS、Atom 还是两者中提供联合发布 feed? 在我看来,Atom 是迄今为止产生的两个(或三个)联合发布格式系列中最好的。 Dave Winer 的 RSS 格式在发布时具有开创性,但它们存在太多问题,无法构成成熟的、企业就绪标准的基础。 我们已经看到了半生不熟的标准(例如早期版本的 HTML 和 JavaScript)所带来的痛苦,并且鉴于联合发布很有可能成为一种重要的通信机制,完整性和明确性是需要考虑的重要因素。

同样重要的是要考虑到互联网日益增长的国际使用,以及人们想要联合发布文本以外的媒体。 Atom 在特殊字符方面缺乏歧义是又一大进步,确保我们可以在 Weblog 条目中包含 < 和 >,而无需担心对联合发布的影响。 最重要的是,计划中的扩展条款将使 Atom 能够满足特定群体和应用程序的需求,而无需重新开放整个规范。

虽然 Atom 非常完整,但它也很容易使用。 显然,人们投入了大量的时间和精力来使 Atom 尽可能易于使用。 创建新的 API 并非易事,尤其是在它旨在尽可能通用时。

最后,RSS 版本号的混乱(由琐碎和政治争论导致并由此产生)对任何人都没有好处。 由于 Atom 有一个不同的名称,尽管字面上是一个语义问题,但它减少了开发人员和用户在使用 RSS 时面临的困惑。

结论

Atom 旨在解决与 RSS 相关的许多问题,并将联合发布转变为跨互联网应用程序的新型高级通信的构建块。 Atom 比 Dave Winer 版本的 RSS 略微复杂,但它比(在其初始版本中)RSS 1.0 更简单,后者使用 RDF 来描述和总结网站。 易于使用的 Atom feed 软件工具、其可扩展性以及作者致力于成为互联网标准社区一员的承诺相结合,清楚地表明 Atom 将在未来的 Web 通信中发挥关键作用。

本文资源: /article/7751

Reuven M. Lerner,一位长期的 Web/数据库顾问和开发人员,现在是西北大学学习科学项目的研究生。 他的 Weblog 位于 altneuland.lerner.co.il,您可以通过 reuven@lerner.co.il 与他联系。

加载 Disqus 评论