📘 第十章 构建Web内容的技术
📄 一句话概括

RSS 和 Atom 都是用 XML 写「这个站点最近更新了什么」。 同一批三条数据,RSS 2.0 写出来 675 字节,Atom 1.0 是 778 字节——Atom 更啰嗦, 但每条必须有全局唯一的 id,时间必须带时区。

📝 本节和前面几节的关系

上一节说完 XML 的语法,这一节看它最普及的一个用途:让程序订阅网站更新。

一、一份给程序读的「最近更新」

网站更新了,读者怎么知道?靠人天天去看是不现实的。 RSS 的办法是:站点自己发一份 XML,列出最近若干条更新,读者用一个「阅读器」定期来取。 所以这份 XML 里必须有:站点叫什么、最近有哪些条目、每条的标题、链接、时间、摘要。 全是结构化字段,程序一眼就能取出来排成列表。 这也解释了它为什么用 XML 而不是 HTML:读者是程序,不是人。 程序不需要好看的排版,只需要确定的字段名。

二、两套字段,对不上

Demo 里同一批三条数据,RSS 2.0 写出来 675 字节,Atom 1.0 写出来 778 字节。 多出来的一百来字节,主要在时间格式和 id 上。 字段对应关系大致是:channel/title 对 feed/title,channel/item 对 feed/entry, item/pubDate 对 entry/updated,item/description 对 entry/summary。 有一处不一样很关键:链接。RSS 把它写在 <link> 元素的文字里,Atom 写在 href 属性里。 所以同样一个地址,两种取法。 另一处更关键:Atom 强制每条有全局唯一的 id。 RSS 2.0 没有这个概念,只能靠链接代替——链接一改,阅读器就会当成一条新内容重复显示。 这一条是 Atom 出现的主要理由之一。

三、Atom 为什么要另起炉灶

RSS 有好几个分支:0.9x、1.0、2.0,历史上分岔过,规范措辞也有含糊的地方。 Atom 想做的是「重新写一份更严谨的」:用 XML 命名空间、强制 id、时间用 RFC 3339 并带时区。 措辞也更明确:字段是「必须有」还是「可以有」,一条条写清楚,不像早期 RSS 那样要靠实践摸索。 结果是两个都活下来了:播客圈几乎全用 RSS(播客客户端只认它),而一些聚合服务同时支持两种。 这场标准之争没有赢家,只有并存。

四、它今天怎么样了

RSS 阅读器在 2013 年谷歌阅读器关停时被很多人判了死刑,但它没死:Feedly、Inoreader 这些还在, 播客全靠它。 变化的是主流入口:社交平台的「关注流」和算法推荐接管了「我该看什么」, RSS 退回成一种「我要自己挑源」的工具。 这一点和 HTTP 的处境有点像:不显眼、没人在意,但底下一直有人用。 判断一个技术死没死,看的是「还有没有人在生产」,不是「有没有话题」。

五、动手 Demo:同一批三条数据,写两种格式

用同样的三条内容,各拼一份 RSS 2.0 和 Atom 1.0,分别解析、取字段、量字节, 再把两边的字段列成对照表。

# RSS 2.0
<rss version="2.0"><channel><title>自学笔记</title>
<item><title>…</title><link>…</link>
<description>…</description><pubDate>2026-10-20</pubDate></item>
</channel></rss>

# Atom 1.0
<feed xmlns="http://www.w3.org/2005/Atom"><title>自学笔记</title>
<entry><title>…</title><link href="…"/><id>…</id>
<updated>2026-10-20T00:00:00Z</updated><summary>…</summary></entry>
</feed>

实跑输出:

--------------------------------------------------------------------
RSS 与 Atom:同一批数据,两种写法
--------------------------------------------------------------------
  RSS 2.0
  根元素                     rss(version=2.0)
  频道标题                   自学笔记
  条目数                     3 个
    图解 HTTP 读完了            2026-10-20  https://example.com/p/1
    WebSocket 握手           2026-10-21  https://example.com/p/2
    WebDAV 的 207           2026-10-22  https://example.com/p/3
  字节数                     675 字节

  Atom 1.0
  根元素                     {http://www.w3.org/2005/Atom}feed
  它是                       带命名空间的 XML
  频道标题                   自学笔记
  条目数                     3 个
    图解 HTTP 读完了            2026-10-20  https://example.com/p/1
    WebSocket 握手           2026-10-21  https://example.com/p/2
    WebDAV 的 207           2026-10-22  https://example.com/p/3
  字节数                     778 字节

  含义             RSS 2.0 的写法        Atom 1.0 的写法
  标题             channel/title      feed/title
  一条内容           channel/item       feed/entry
  时间             item/pubDate       entry/updated
  链接             item/link(元素文字)    entry/link(href 属性)
  摘要             item/description   entry/summary
  唯一标识           靠 link 代替          entry/id(必须有)

  Atom 的三点改变最关键:时间必须是 RFC 3339 格式(带时区)、

两边都解析出 3 条,字段也都取到了。 RSS 的根元素是 rss,Atom 的根元素是 {http://www.w3.org/2005/Atom}feed——那个大括号是命名空间, 说明 Atom 是带命名空间的 XML。 675 字节 对 778 字节。Atom 多了 103 字节,多的是每条那个 id 和更长的 updated 时间戳。 读 Atom 的时候代码里必须带命名空间前缀 {http://www.w3.org/2005/Atom}entry, 否则 find('entry') 一个都找不到。这是新手最容易踩的坑。 id 那一栏值得单独看:RSS 那边写的是「靠 link 代替」,Atom 那边是「必须有」。 一条内容改了标题,RSS 阅读器可能当成新条目,Atom 靠 id 就不会——这就是那 103 字节买到的东西。

30 秒实验

  1. 给 Atom 那条 entry 的 id 换一个值,看阅读器(或解析脚本)会当成新条目还是同一条。
  2. 把 updated 的时间去掉时区,再用严格的解析器试一遍。
  3. 想一想:如果你要做播客,为什么只能用 RSS 而不是 Atom?

常见误区

  1. 「RSS 和 Atom 是同一个东西的两种叫法」——两个不同的规范,字段名都不一样。
  2. 「Atom 比 RSS 新所以更好」——各有场景,播客生态实际只认 RSS。
  3. 「RSS 已经死了」——阅读器和播客还在用,只是不再是主入口。
自测三问(点开对答案) 1. RSS 和 Atom 是干什么用的? —— 用 XML 发布站点的最近更新,供程序订阅和读取。 2. Atom 相比 RSS 2.0 最关键的加强是什么? —— 每条必须有全局唯一的 id,时间必须用带时区的 RFC 3339 格式。 3. 解析 Atom 时最容易踩的坑是什么? —— 它带命名空间,查元素必须带 `{...}` 前缀。

XML 传数据挺好,就是啰嗦。有人从 JavaScript 里抠出一小套语法,结果火了。

相关笔记