以樹方式使用 REXML
REXML 的目的是 正好夠用。在最大程度上,它能很好地完成任務。 實際上, REXML 支持兩種不同樣式的 XML 處理 ― “樹”和“流”。 第一種樣式是 DOM 所嘗試要做的更簡單的版本;第二種樣式是 SAX 所嘗試要做的更簡單的版本。 讓我們先研究樹樣式。假設我們要提取上一個示例中的同一個地址簿文檔。 下面的示例來自我所創建的經修改的 eval.rb ; 標準 eval.rb (鏈接到 Ruby 教程)可以根據對復雜對象的表達式求值顯示非常長的計算結果 ― 我的 eval.rb 在沒有錯誤發生的情況下不作出反應:
如何使用 REXML 來引用嵌套數據
ruby> require "rexml/document"ruby> include REXMLruby> addrbook = (Document.new File.new "address.xml").rootruby> persons = addrbook.elements.to_a("http://person")ruby> puts persons[1].elements["address"].attributes["city"]New York
這個表達式很普通。 .to_a() 方法創建文檔中所有 <person> 元素的數組,在其它命名中它可能是有用的。 元素有點象 DOM 節點,但它其實更接近于 XML 本身(而且使用起來也更簡單)。 .to_a() 的參數是 XPath,在這種情況下,可以標識文檔中任何地方的所有 <person> 元素。如果我們只需要第一層上的元素,可以使用:
創建匹配元素的數組
ruby> persons = addrbook.elements.to_a("/addressbook/person")
我們甚至可以更直接地將 XPath 用作 .elements 屬性的重載索引。例如:
使用 REXML 來引用嵌套數據的另一種方法
ruby> puts addrbook.elements["http://person[2]/address"].attributes["city"]New York
請注意,XPath 使用基于 1 的索引,不象 Ruby 和 Python 數組使用基于 0 的索引。換句話說, 它仍是我們正在檢查其所在城市的同一個人。通過查看 REXML 請注意,XPath 使用基于 1 的索引,不象 Ruby 和 Python 數組使用基于 0 的索引。換句話說, 它仍是我們正在檢查其所在城市的同一個人。通過查看
用 REXML 顯示元素的 XML 源代碼
ruby> puts addrbook.elements["http://person[2]/address"]<address city='New York' street='118 St.' number='344' state='NY'/>ruby> puts addrbook.elements["http://person[2]/contact-info"]<contact-info> <email address='robb@iro.ibm.com'/> <home-phone number='03-3987873'/></contact-info>
此外,XPath 不必只與一個元素匹配。我們已在定義 persons 數組時看見過,但另一個示例強調了這一點:
將多個元素與 XPath 匹配
ruby> puts addrbook.elements.to_a("http://person/address[@state='CA']")<address city='Sacramento' street='Spruce Rd.' number='99' state='CA'/><address city='Los Angeles' street='Pine Rd.' number='1234' state='CA'/>
新聞熱點
疑難解答