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 中包含 titlebody 中包含分组的 outline。每一个 outline 中包含 text, type, xmlUrl 等属性。接下来我们详细描述这个格式。

OPML 文件中的节点解释

opml 根节点

<opml> 是 OPML 格式文件的根节点,其 version 属性是必要的。它的值可能为 1.02.0;如果是 1.0,则视为符合 OPML 1.0 规范;如果是 2.0,则视为符合 OPML 2.0 规范。额外的,值也可能是 1.1,那么也视为符合 1.0 规范。

opml 根节点中包含 headbody 节点。

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
    • 布尔值,为 truefalse;如果为 true,那么次 outline 就只是注释而已
  • isBreakpoint
    • 适用于脚本,执行时可下断点
  • created
    • 一个时间,表示此节点的创建时间
  • category
    • 逗号分隔的类别:如果表示分类,则要用 / 分隔子类别;如果表示标签,则不加 /
    • 例如:/Boston/Weather, /Harvard/Berkman,/Politics(例子来源于官方规范)

outline(RSS 专属)

typerss 时,还有一些 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 订阅(概念篇)相关推荐

  1. 在RSS服务器上订阅网站,快速服务器上的RSS订阅实现

    我正在设置一个订阅RSS提要的node.js服务器.当有新项目发布到提要时,我希望服务器解析该信息并将其传递给API,该API将警告最终用户.我可以将feedparser用作订户吗? 我知道该库创建了 ...

  2. html个人博客_简单 4 步,为你的个人博客配置 RSS 订阅

    最近对于千篇一律的科技新闻,感到了一丝的阅读疲倦.因此,想要寻找一些有有趣的灵魂或者独立思考的博文,打发平时无聊的摸鱼时光.但是,随着在互联网上探索有意思的博客,发现绝大部分都没有提供相关的订阅链接, ...

  3. 如何自己手动搭建一个RSS订阅机器人(rssbot),自己做一个RSS阅读器

    当你想RSS订阅一些自己感兴趣的博客,却又苦于免费的RSS阅读器广告很多时,可以自己借助Telegram机器人搭建一个RSS订阅机器人.本文老王介绍下如何搭建一个Telegram RSS订阅机器人,以 ...

  4. RSS订阅与RSS阅读的常见问题解答

    关于RSS订阅与RSS阅读的常见问题解答(1) (www.marketingman.net 冯英健 2005-09-12) [摘要]:网上营销新观察近日将在网络营销前沿栏目陆续发布有关RSS与网络 ...

  5. RSS阅读——在繁杂的社会接受纯粹的信息 RSS介绍与RSS订阅源分享

    在互联网信息大爆炸的背景下,人们需要一种全新的知识获取与整理方法.当我们面对繁杂的信息时,一种全新的技术诞生了 RSS(简易信息聚合技术)的诞生与发展 RSS技术的诞生 RSS技术是由Netscape ...

  6. RSS订阅神器 —— Inoreader

    一.Inoreader简介 根据维基百科的介绍 Inoreader是基于网络的内容和RSS摘要阅读器,适用于网络浏览器的云服务和运行iOS和Android的移动设备.它以统一的布局编辑用户的在线来源的 ...

  7. Web版RSS阅读器(三)——解析在线Rss订阅

    上篇博客<Web版RSS阅读器(二)--使用dTree树形加载rss订阅分组列表>已经写到读取rss订阅列表了,今天就说一下,当获取一条在线rss订阅的信息,怎么去解析它,从而获取文章或资 ...

  8. QT解析 JSON 格式的数据

    QT解析 JSON 格式的数据 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式.JSON 采用完全独立于语言的文本格式,这些特性使 JSON 成为理想的数 ...

  9. Java-json系列(一):用GSON解析Json格式数据

    GSON是谷歌提供的开源库,用来解析Json格式的数据,非常好用.如果要使用GSON的话,则要先下载gson-2.2.4.jar这个文件,如果是在Android项目中使用,则在Android项目的li ...

  10. 【Python使用】Python解析JSON数据的基本方法/用MATLAB解析json格式数据

    一 JSON数据格式介绍 JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式. JSON建构于两种结构:json是Javascript中的对象和数组中的对象, ...

最新文章

  1. matlab 全局变量
  2. 安全攻防实战:使用winlogonhack获取系统密码
  3. 【每日一算法】二叉树的最小深度
  4. 基础004:R语言数据处理和变换——dplyr
  5. mssql sqlserver sql脚本自动遍历重复生成指定表记录
  6. Git record
  7. POJ 计算几何入门题目推荐
  8. 为何Transformer在计算机视觉中如此受欢迎
  9. 上传附件的格式和大小限制
  10. java通过+拼接字符串导致的无效SQL,三目运算符与+运算符结合使用时需要注意了
  11. 【转】保证训练集和测试集取到和数据集中相同比例的类别
  12. 简单sql存储过程实例、储过程实战
  13. LintCode Memcache
  14. storm启动报错,storm-ui界面显示不正常
  15. 中职生计算机求职信350,护士求职信350字
  16. Node.js 应用开发详解07 CPU 过载保护设计:如何在服务层面确保系统稳定?
  17. 莫斯科的年轻人(一)
  18. 2018 SUCTF招新赛
  19. 淘宝用户日志数据集的用户行为分析与用户分群
  20. sql练习 使用储存池

热门文章

  1. 苹果MacBook常用快捷键 复制 粘贴 截屏 录屏快捷键
  2. android自定义数字键盘
  3. Separating Axis Theorem(分离轴理论)Raycast
  4. 一文搞懂什么是Hadoop?Hadoop的前世今生,Hadoop的优点有哪些?Hadoop面试考查重点,大数据技术生态体系
  5. 自媒体剪辑中常用的premere快捷键
  6. java md5加密解密_JAVA实现MD5加密解密
  7. 运用SMART法制定恰当的目标
  8. 其实,以前都没发现------网易公开课
  9. thinkpad使用u盘启动
  10. Tongweb 7 集中管理工具