Ruby XML, XSLT 和 XPath 教程
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 。