使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)
OPML 全称是 Outline Processor Markup Language ,即 大纲处理标记语言。目前流行于收集博客的 RSS 源,便于用户转移自己的订阅项目。
本文将介绍这个古老的格式,并提供一个 .NET 上的简易解析器。
本文分为两个部分,一个是理解 OPML 格式,一个是解析此格式:
- 概念篇(本文)
- 解析篇
本文内容
- OPML 格式
- 典型的 OPML 文件
- OPML 文件中的节点解释
- opml 根节点
- head 节点
- body 节点
- outline(普通)
- outline(RSS 专属)
- OPML 的解析
OPML 格式
RSS 订阅你应该并不陌生,你可以在我的博客上方看到 RSS 的订阅源按钮,也可以在各大博客站点发现这样的订阅按钮。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Oax9S9Ht-1582957371395)(/static/posts/2018-09-23-feed-icon.svg)]
▲ RSS 图标
图片来源于维基百科,如果你不太了解 RSS,可以直接前往 RSS - 维基百科,自由的百科全书 查看或者自己搜索。
OPML 是个古老的格式,第一个版本还是二十世纪六十年代的产物呢(详见 OPML 1.0 Specification);只不过实际在用的 1.0 版本是 2000 年发布的,2.0 版本是 2007 年发布的。这么古老的格式也不妨碍它依然成为订阅源交换的标准格式。不过我们这篇文章不会去谈历史,我们只谈它的格式以及使用。
OPML 官网对其作用的描述为:
The purpose of this format is to provide a way to exchange information between outliners and Internet services that can be browsed or controlled through an outliner.
OPML is also the file format for an outliner application, which is why OPML files may contain information about the size, position and expansion state of the window the outline is displayed in.
OPML has also become popular as a format for exchanging subscription lists between feed readers and aggregators.
其中最后一行的描述即交换订阅,尤其是 RSS 订阅。
典型的 OPML 文件
为了直观地了解 OPML 格式,我直接贴一个我的订阅的极简版文件内容。
<?xml version="1.0" encoding="UTF-8"?>
<opml version="1.0"><head><title>walterlv</title></head><body><outline text="walterlv" title="walterlv" type="rss" xmlUrl="https://blog.walterlv.com/feed.xml" htmlUrl="https://blog.walterlv.com/" /><outline title="Team" text="Team"><outline text="林德熙" title="林德熙" type="rss" xmlUrl="https://blog.lindexi.com/feed.xml" htmlUrl="https://blog.lindexi.com/" /></outline><outline title="Microsoft" text="Microsoft"><outline text="Microsoft .NET Blog" title="Microsoft .NET Blog" type="rss" xmlUrl="https://blogs.msdn.microsoft.com/dotnet/feed/"/><outline text="Microsoft The Visual Studio Blog" title="Microsoft The Visual Studio Blog" type="rss" xmlUrl="https://blogs.msdn.microsoft.com/visualstudio/feed/"/></outline></body>
</opml>
你可以很容易地看出它的一些特征。比如以 opml
为根,head
中包含 title
,body
中包含分组的 outline
。每一个 outline
中包含 text
, type
, xmlUrl
等属性。接下来我们详细描述这个格式。
OPML 文件中的节点解释
opml 根节点
<opml>
是 OPML 格式文件的根节点,其 version
属性是必要的。它的值可能为 1.0
或 2.0
;如果是 1.0
,则视为符合 OPML 1.0 规范;如果是 2.0
,则视为符合 OPML 2.0 规范。额外的,值也可能是 1.1
,那么也视为符合 1.0 规范。
opml
根节点中包含 head
和 body
节点。
head 节点
head
节点可包含 0 个或多个元素:
title
- 这就是 OPML 文档标题
dateCreated
- 文档创建时间
dateModified
- 文档修改时间
ownerName
- 文档作者
ownerEmail
- 文档作者的邮箱
ownerId
- 文档作者的 url,要求不存在相同 Id 的两个作者
docs
- 描述此文档的文档的 url
当然,这些都是可选的。
额外的,还有 expansionState
, vertScrollState
, windowTop
, windowLeft
, windowBottom
, windowRight
。
body 节点
body
节点包含一个或多个 outline
元素。
outline(普通)
outline 元素组成一个树状结构。也就是说,如果我们使用 OPML 储存 RSS 订阅列表,那么可以存为树状结构。在前面的例子中,我把自己的 RSS 订阅独立开来,把朋友和微软的 RSS 订阅分成了单独的组。
outline
必须有 text
属性,其他都是可选的。而 text
属性就是 RSS 订阅的显示文字,如果没有这个属性,那么 RSS 的订阅列表中将会是空白一片。
于是,我们解析 text
属性便可以得到可以显示出来的 RSS 订阅列表。对于前面的例子对应的 RSS 订阅列表就可以显示成下面这样:
- walterlv
- Team- 林德熙
- Microsoft- Microsoft .NET Blog- Microsoft The Visual Studio Blog
outline
还有其他可选属性:
type
- 指示此
outline
节点应该如何解析
- 指示此
isComment
- 布尔值,为
true
或false
;如果为true
,那么次outline
就只是注释而已
- 布尔值,为
isBreakpoint
- 适用于脚本,执行时可下断点
created
- 一个时间,表示此节点的创建时间
category
- 逗号分隔的类别:如果表示分类,则要用
/
分隔子类别;如果表示标签,则不加/
- 例如:
/Boston/Weather
,/Harvard/Berkman,/Politics
(例子来源于官方规范)
- 逗号分隔的类别:如果表示分类,则要用
outline(RSS 专属)
当 type
是 rss
时,还有一些 RSS 专属属性。这时,必要属性就有三个了:
type
text
xmlUrl
其中,xmlUrl
就指的是订阅源的 url 地址了。在官方规范中,规定解析器不应该总认为 text
存在,相比之下,xmlUrl
显得更加重要。
还有一些可选属性:
description
htmlUrl
language
title
version
OPML 的解析
在了解了 OPML 的格式组成之后,便可以很容易的地解析此文件了。当然,我也写了一份 OPML 的解析,请参阅本文的第二部分,解析篇。
我的博客会首发于 https://blog.walterlv.com/,而 CSDN 会从其中精选发布,但是一旦发布了就很少更新。
如果在博客看到有任何不懂的内容,欢迎交流。我搭建了 dotnet 职业技术学院 欢迎大家加入。
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。欢迎转载、使用、重新发布,但务必保留文章署名吕毅(包含链接:https://walterlv.blog.csdn.net/),不得用于商业目的,基于本文修改后的作品务必以相同的许可发布。如有任何疑问,请与我联系。
使用并解析 OPML 格式的订阅列表来转移自己的 RSS 订阅(概念篇)相关推荐
- 在RSS服务器上订阅网站,快速服务器上的RSS订阅实现
我正在设置一个订阅RSS提要的node.js服务器.当有新项目发布到提要时,我希望服务器解析该信息并将其传递给API,该API将警告最终用户.我可以将feedparser用作订户吗? 我知道该库创建了 ...
- html个人博客_简单 4 步,为你的个人博客配置 RSS 订阅
最近对于千篇一律的科技新闻,感到了一丝的阅读疲倦.因此,想要寻找一些有有趣的灵魂或者独立思考的博文,打发平时无聊的摸鱼时光.但是,随着在互联网上探索有意思的博客,发现绝大部分都没有提供相关的订阅链接, ...
- 如何自己手动搭建一个RSS订阅机器人(rssbot),自己做一个RSS阅读器
当你想RSS订阅一些自己感兴趣的博客,却又苦于免费的RSS阅读器广告很多时,可以自己借助Telegram机器人搭建一个RSS订阅机器人.本文老王介绍下如何搭建一个Telegram RSS订阅机器人,以 ...
- RSS订阅与RSS阅读的常见问题解答
关于RSS订阅与RSS阅读的常见问题解答(1) (www.marketingman.net 冯英健 2005-09-12) [摘要]:网上营销新观察近日将在网络营销前沿栏目陆续发布有关RSS与网络 ...
- RSS阅读——在繁杂的社会接受纯粹的信息 RSS介绍与RSS订阅源分享
在互联网信息大爆炸的背景下,人们需要一种全新的知识获取与整理方法.当我们面对繁杂的信息时,一种全新的技术诞生了 RSS(简易信息聚合技术)的诞生与发展 RSS技术的诞生 RSS技术是由Netscape ...
- RSS订阅神器 —— Inoreader
一.Inoreader简介 根据维基百科的介绍 Inoreader是基于网络的内容和RSS摘要阅读器,适用于网络浏览器的云服务和运行iOS和Android的移动设备.它以统一的布局编辑用户的在线来源的 ...
- Web版RSS阅读器(三)——解析在线Rss订阅
上篇博客<Web版RSS阅读器(二)--使用dTree树形加载rss订阅分组列表>已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资 ...
- QT解析 JSON 格式的数据
QT解析 JSON 格式的数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON 采用完全独立于语言的文本格式,这些特性使 JSON 成为理想的数 ...
- Java-json系列(一):用GSON解析Json格式数据
GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...
- 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据
一 JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON建构于两种结构:json是Javascript中的对象和数组中的对象, ...
最新文章
- matlab 全局变量
- 安全攻防实战:使用winlogonhack获取系统密码
- 【每日一算法】二叉树的最小深度
- 基础004:R语言数据处理和变换——dplyr
- mssql sqlserver sql脚本自动遍历重复生成指定表记录
- Git record
- POJ 计算几何入门题目推荐
- 为何Transformer在计算机视觉中如此受欢迎
- 上传附件的格式和大小限制
- java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了
- 【转】保证训练集和测试集取到和数据集中相同比例的类别
- 简单sql存储过程实例、储过程实战
- LintCode Memcache
- storm启动报错,storm-ui界面显示不正常
- 中职生计算机求职信350,护士求职信350字
- Node.js 应用开发详解07 CPU 过载保护设计:如何在服务层面确保系统稳定?
- 莫斯科的年轻人(一)
- 2018 SUCTF招新赛
- 淘宝用户日志数据集的用户行为分析与用户分群
- sql练习 使用储存池