Ruby XML, XSLT 和 XPath 教學
什麼是 XML ?
XML 指可擴展標記語言(eXtensible Markup Language)。
可擴展標記語言,標準通用標記語言的子集,一種用於標記電子檔使其具有結構性的標記語言。
它可以用來標記數據、定義數據類型,是一種允許用戶對自己的標記語言進行定義的源語言。 它非常適合萬維網傳輸,提供統一的方法來描述和交換獨立於應用程式或供應商的結構化數據。
更多內容請查看我們的 XML 教學
XML解析器結構和API
XML的解析器主要有DOM和SAX兩種。
- SAX解析器是基於事件處理的,需要從頭到尾把XML文檔掃描一遍,在掃描的過程中,每次遇到一個語法結構時,就會調用這個特定語法結構的事件處理程式,向應用程式發送一個事件。
- DOM是文檔對象模型解析,構建文檔的分層語法結構,在內存中建立DOM樹,DOM樹的節點以對象的形式來標識,文檔解析文成以後,文檔的整個DOM樹都會放在記憶體中。
Ruby 中解析及創建 XML
RUBY中對XML的文檔的解析可以使用這個庫REXML庫。
REXML庫是ruby的一個XML工具包,是使用純Ruby語言編寫的,遵守XML1.0規範。
在Ruby1.8版本及其以後,RUBY標準庫中將包含REXML。
REXML庫的路徑是: rexml/document
所有的方法和類都被封裝到一個REXML模組內。
REXML解析器比其他的解析器有以下優點:
- 100% 由 Ruby 編寫。
- 可適用於 SAX 和 DOM 解析器。
- 它是羽量級的,不到2000行代碼。
- 很容易理解的方法和類。
- 基於 SAX2 API 和完整的 XPath 支持。
- 使用 Ruby 安裝,而無需單獨安裝。
以下為實例的 XML 代碼,保存為movies.xml:
DOM 解析器
讓我們先來解析 XML 數據,首先我們先引入 rexml/document 庫,通常我們可以將 REXML 在頂級的命名空間中引入:
實例
以上實例輸出結果為:
Root element : New Arrivals Movie Title : Enemy Behind Movie Title : Transformers Movie Title : Trigun Movie Title : Ishtar Movie Type : War, Thriller Movie Type : Anime, Science Fiction Movie Type : Anime, Action Movie Type : Comedy Movie Description : Talk about a US-Japan war Movie Description : A schientific fiction Movie Description : Vash the Stampede! Movie Description : Viewable boredom SAX-like Parsing:
SAX 解析器
處理相同的數據檔:movies.xml,不建議SAX的解析為一個小檔,以下是個簡單的實例:
實例
以上輸出結果為:
tag_start: "collection", {"shelf"=>"New Arrivals"} tag_start: "movie", {"title"=>"Enemy Behind"} tag_start: "type", {} text : "War, Thriller" tag_start: "format", {} tag_start: "year", {} tag_start: "rating", {} tag_start: "stars", {} tag_start: "description", {} text : "Talk about a US-Japan war" tag_start: "movie", {"title"=>"Transformers"} tag_start: "type", {} text : "Anime, Science Fiction" tag_start: "format", {} tag_start: "year", {} tag_start: "rating", {} tag_start: "stars", {} tag_start: "description", {} text : "A schientific fiction" tag_start: "movie", {"title"=>"Trigun"} tag_start: "type", {} text : "Anime, Action" tag_start: "format", {} tag_start: "episodes", {} tag_start: "rating", {} tag_start: "stars", {} tag_start: "description", {} text : "Vash the Stampede!" tag_start: "movie", {"title"=>"Ishtar"} tag_start: "type", {} tag_start: "format", {} tag_start: "rating", {} tag_start: "stars", {} tag_start: "description", {} text : "Viewable boredom"
XPath 和 Ruby
我們可以使用XPath來查看XML ,XPath 是一門在 XML 文檔中查找資訊的語言(查看:XPath 教學)。
XPath即為XML路徑語言,它是一種用來確定XML(標準通用標記語言的子集)文檔中某部分位置的語言。XPath基於XML的樹狀結構,提供在數據結構樹中找尋節點的能力。
Ruby 通過 REXML 的 XPath 類支持 XPath,它是基於樹的分析(文檔對象模型)。
實例
以上實例輸出結果為:
<movie title='Enemy Behind'> ... </> War, Thriller Anime, Science Fiction Anime, Action Comedy ["DVD", "DVD", "DVD", "VHS"]
XSLT 和 Ruby
Ruby 中有兩個 XSLT 解析器,以下給出簡要描述:
Ruby-Sablotron
這個解析器是由正義Masayoshi Takahash編寫和維護。這主要是為Linux操作系統編寫的,需要以下庫:
- Sablot
- Iconv
- Expat
你可以在 Ruby-Sablotron 找到這些庫。
XSLT4R
XSLT4R 由 Michael Neumann 編寫。 XSLT4R 用於簡單的命令行交互,可以被第三方應用程式用來轉換XML文檔。XSLT4R需要XMLScan操作,包含了 XSLT4R 歸檔,它是一個100%的Ruby的模組。這些模組可以使用標準的Ruby安裝方法(即Ruby install.rb)進行安裝。
XSLT4R 語法格式如下:
如果您想在應用程式中使用XSLT4R,您可以引入XSLT及輸入你所需要的參數。實例如下:
實例
更多資料
- 完整的 REXML 解析器, 請查看文檔 REXML 解析器文檔。
- 你可以從 RAA 知識庫 中下載 XSLT4R 。