Feed 用于联合新闻归档或类似于 blog 的 Web 应用程序中的数据。本例中的 feed(如清单 1 所示)具有潜在的问题,其条目的 id 有可能在别处产生重复。如果此重复项未覆盖当前的条目,那么将在联合中创建重复的内容。
清单 1. 原始 feed
<?xml version='1.0' encoding='UTF-8'?>
<feed xmlns='http://www.w3.org/2005/Atom'
xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/'>
<id>http://www.example.com/myblog/index.html</id>
<updated>2007-01-10T17:23:36.222-08:00</updated>
<title type='text'>MyBlog updates</title>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/index.html'></link>
<link rel='next' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default?start-index=26&max-results=2
5'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default'></link>
<author><name>tsa</name></author>
<generator version='1.01' uri='http://www.example.com'>Example
Blogerator</generator>
<openSearch:totalResults>2</openSearch:totalResults>
<openSearch:startIndex>1</openSearch:startIndex>
<entry>
<id>http://www.example.com/myblog/posts/55</id>
<published>2007-01-10T17:21:00.000-08:00</published>
<updated>2007-01-10T17:23:35.767-08:00</updated>
<title type='text'>My first post ever</title>
<content type='html'>Content goes here!</content>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/posts/55'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default/55'></link>
<link rel='edit' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/edit/55'></link>
<author><name>tsa</name></author></entry>
<entry>
<id>http://www.example.com/myblog/posts/56</id>
<published>2007-01-11T17:21:00.000-08:00</published>
<updated>2007-01-10T17:23:35.767-08:00</updated>
<title type='text'>My second post ever</title>
<content type='html'>Content for second post goes here!</content>
<link rel='alternate' type='text/html'
href='http://www.example.com/myblog/posts/56'></link>
<link rel='self' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/default/56'></link>
<link rel='edit' type='application/atom+xml'
href='http://www.example.com/myblog/feeds/posts/edit/56'></link>
<author><name>tsa</name></author></entry>
</feed>
|
清单 1 中的 feed 只包含了两个条目。在本技巧中,您只需关注 id 和 link 标签,以及 Atom feed 的源 URL(包含在link 中)。这是一个有效的 Atom 1.0 feed,但在 id 标签的构造中存在着潜在的隐患。
问题的症结就在于使用 URL,或者说是 link 标签的内容,被作为 id 使用。我们必须按照 Atom syndication format 规范以确保惟一性的方式创建 atom:id 元素。(请参阅 参考资料 部分的链接)。
尽管 blog、新闻 Web 站点或者任何联合内容的结构都有助于防止 id 条目的重复,但是使用 URL 作为 atom:id 元素的内容仍然有产生数据重复的隐患,因此不建议采用这种方式。
比方说,您有可能会编辑 blog 中的一篇帖子或者文章。您保存了新内容后,该内容的 URL 将会与原内容的 URL 一样。然而,这还将创建一条新的数据库条目,也就是说 Atom 条目必须要有一个区别于被更新条目的惟一的 id。
解决的途径是正确地安排 atom:id 元素的格式。格式化 id 元素的最常用方法就是使用 “标签” URL 方案(请参阅 参考资料 获得完整的规范)。
从本质上来说,该方案采用的格式可以保证创建 atom:id 元素的过程中不产生数据重复,而且 atom:id 元素仍然可以转化为 URL。
上例中的 3 个 id 元素可以转化为标签方案,如清单 2 所示。
清单 2. 将
id 元素转化为标签方案
<id>tag:example.com,2007:myblog</id>
<id>tag:example.com,2007:myblog.post-55</id>
<id>tag:example.com,2007:myblog.post-56</id>
|
现在如果您在编辑一个帖子,URL 或者 link 元素将不会发生变化,可是 id 元素可能会变成如下形式: <id>tag:example.com,2007:myblog.post-55.edit-0</id>。URL 仍然可以从 id 元素处获取,这样在编辑完成后也就毫无顾虑了。
这样就完成了! 我希望您不会再因为 atom:id 元素格式安排不当而遇到 feed 条目重复和覆盖的问题。
现在您应该进一步了解了 Atom feed,认识到了保持 atom:id 元素惟一的重要性。更重要的是,在您开发代码创建 feed 时,应牢记本文讨论的思想,确保在 feed 条目中不会出现 atom:id 元素重复的现象。
| 描述 | 名字 | 大小 | 下载方法 |
|---|---|---|---|
| Atom 数据重复示例 | x-tipatom1-dup-source.zip | 2KB | HTTP |
学习
- 您可以参阅本文在 developerWorks 全球网站上的 英文原文。
- 参阅 “翻页 Atom:创建一个多段的 Atom 集合或 feed 页面”,了解如何创建一个可供用户使用 “上一页” 和 “下一页” 链接或按钮翻阅发布内容的 Atom feed。
-
atom:id element:获取有关 Atom 联合格式的信息。
-
“标签” URI方案:获取完整的 “标签” 统一资源标识符(Uniform Resource Identifier,URI)方案。
-
On RSS and Atom:阅读 DeWitt Clinton 的 blog。
-
Atom 1.0 Syndication Format 概述(James Snell,developerWorks,2005 年 8 月):看看该流行的 Web 内容联合格式是如何构成的。
-
“认识 Atom 发布协议”系列(James Snell,developerWorks,2006 年 10 月 - 12 月):在该系列的三篇文章中获取有关 Atom API 的知识:
- 认识 Atom 发布协议,第 1 部分: 使用 Atom 发布协议创建和编辑 Web 资源: 探究协议的高级概述及其基本操作和功能。
- 认识 Atom 发布协议,第 2 部分: 应用 Atom 发布协议: 学习使用APP与大量现实世界中部署好的应用程序进行交互。
- 认识 Atom 发布协议,第 3 部分: Apache Abdera 项目简介: 开始使用新兴的开放源码项目(称作 Abdera,目前正处于 Apache Software Foundation 的筹划之中)实现支持 Atom 的应用程序。
-
RSS and Atom in Action(Dave Johnson,Manning Publications,2006 年 7 月):如果您更想了解物理实现方面的内容,可以阅读本书。该书介绍了新闻 feed 格式和协议发布的 blog 技术以及如何将这些技术结合起来(本书附有 blog 应用程序)。
-
Atom 1.0 规范:通过阅读了解该基于 XML 的 Web 内容以及元数据联合格式。.
-
Atom 1.0 兼容软件:访问 Atom Working Group 的 Wiki,获取已知 Atom 1.0 feed 消费者列表。
-
Thinking XML: 使用 Atom 格式连锁新闻及其他内容(Uche Ogbuji,developerWorks,2004 年 5 月):通过阅读了解更多有关该基于 XML 标准、格式和 API 的知识,以便对 Web 元数据进行互换和交叉引用。
-
developerWork 中国网站 XML 专区:通过 developerWorks 中国网站 XML 专区了解 XML 的方方面面。
-
IBM XML 认证:看看如何才能成为一名 IBM 认证的 XML 及相关技术的开发人员。
-
XML 技术文档库:developerWorks XML 专区提供了大量技术文章和技巧、教程、标准以及 IBM 红皮书。
-
developerWorks 技术事件与网络广播:随时关注 developerWorks 技术事件和网络广播。
获得产品和技术
-
feedvalidator.org:验证您的 Atom feed 生成器。
讨论
- 参与论坛讨论。
-
XML 专区讨论论坛:参与任何以 XML 为中心的论坛。