使用並解析 OPML 格式的訂閱列表來轉移自己的 RSS 訂閱(概念篇)

OPML 全稱是 Outline Processor Markup Language ,即 大綱處理標記語言。目前流行於收集博客的 RSS 源,便於用戶轉移自己的訂閱項目。

本文將介紹這個古老的格式,並提供一個 .NET 上的簡易解析器。


本文分爲兩個部分,一個是理解 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/),不得用於商業目的,基於本文修改後的作品務必以相同的許可發佈。如有任何疑問,請與我聯繫

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章