麻豆小视频在线观看_中文黄色一级片_久久久成人精品_成片免费观看视频大全_午夜精品久久久久久久99热浪潮_成人一区二区三区四区

首頁 > 編程 > Ruby > 正文

詳解Ruby中X處理數據庫REXML的使用方法

2020-02-24 15:39:25
字體:
來源:轉載
供稿:網友

RubyXML唯一的數據庫,其實它是一個很受大家歡迎的數據庫,它是用純Ruby編寫的,今天武林技術頻道小編和大家分享詳解Ruby中X處理數據庫REXML的使用方法,一起來學習一下吧!

以樹方式使用 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='[email protected]'/> <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'/>

與此相反, .elements 屬性的索引只產生 第一個匹配的元素:
當 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'/>

也可以通過 REXML 中的 XPath 類使用 XPath 地址, 它具有諸如 .first() 、 .each() 和 .match() 這樣的方法。
REXML 元素的一個獨特的慣用方法是 .each 迭代器。雖然 Ruby 有一個可對集合進行操作的循環結構 for , 但 Ruby 程序員通常更喜歡使用迭代器方法來將控制傳遞給代碼塊。下面的兩種結構是等價的, 但第二種結構有更為自然的 Ruby 感覺:
通過在 REXML 中匹配 XPath 進行迭代

ruby> for addr in addrbook.elements.to_a("http://address[@state='CA']")  |  puts addr.attributes["city"]  | endSacramentoLos Angelesruby> addrbook.elements.each("http://address[@state='CA']") {  |  |addr| puts addr.attributes["city"]  | }SacramentoLos Angeles

以流方式使用 REXML
出于“正好夠用”的目的, REXML 的樹方式可能是 Ruby 語言最簡單的方法。 但 REXML 還提供了一種流方式,它象是 SAX 的更輕量級的變體。 正如使用 SAX 一樣, REXML 沒有向應用程序程序員提供來自 XML 文檔的缺省數據結構。 相反,“listener”或“handler”類負責提供響應文檔流中各種事件的一組方法。 以下是常用集合:開始標記、結束標記、遇到的元素文本等等。
雖然流方式遠遠沒有象以樹方式工作那樣容易,但通常它的速度要快很多。 REXML 教程聲稱流方式的速度要快 1500倍。 雖然我沒有嘗試過對它進行基準測試,但我猜想這是一種有限的情況(我的小示例在樹方式中也是瞬間完成的)。 總之,如果速度要緊,那么速度上的差異很可能是顯著的。
讓我們研究一個非常簡單的示例,它所做的事情與上面的“列出加州城市”示例相同。 對它進行擴展以用于復雜的文檔處理相對比較簡單:
REXML 中 XML 文檔的流處理

ruby> require "rexml/document"ruby> require "rexml/streamlistener"ruby> include REXMLruby> class Handler  |  include StreamListener  |  def tag_start name, attrs  |    if name=="address" and attrs.assoc("state")[1]=="CA"  |     puts attrs.assoc("city")[1]  |    end  |  end  | endruby> Document.parse_stream((File.new "address.xml"), Handler.new)SacramentoLos Angeles

流處理示例中要注意的一件事情是,標記屬性被作為一組數組傳遞, 它要處理的工作比起散列要稍微多一點(但可能在庫中創建會更快)。

編碼問題
REXML所有文本節點中都是以UTF-8編碼的,所有調用的代碼都要注意這一點,在程序中,傳遞給REXML的字符串必須是經過UTF-8編碼的。

REXML不可能總是正確猜測出你的文本的編碼方式,所以它總是假定為UTF-8編碼。同時,如果你試圖添加其他編碼方式的文本,REXML不會發 出警告。添加者必須保證自己添加的是UTF-8的文本。如果添加標準的ASCII 7位編碼,是沒有關系的。如果使用ISO8859-1文本,必須在添加之前轉換為UTF-8編碼。可以使用text.unpack("C").pack("U")。變更編碼進行輸出,只有Document.write()和Document.to_s() 支持。如果需要輸出特定編碼的節點,必須用Output把輸出對象包裝起來。

e = Element.new "<a/>"e.text = "f/xfcr"  # ISO-8859-1 '??'o = ''e.write( Output.new( o, "ISO-8859-1" ) )

可以向Output傳遞任何支持的編碼。

以上就是我們為各位朋友們介紹的詳解Ruby中X處理數據庫REXML的使用方法,各位朋友們看完之后,是不是非常的清楚了呢?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 中文字幕在线观看精品 | 国产精品欧美日韩一区二区 | 国产精品成人免费一区久久羞羞 | 真人一级毛片免费 | 爱视频福利 | 欧美a久久 | 国内精品久久久久久久影视红豆 | 毛片在线视频观看 | 欧美日韩高清在线观看 | 欧美在线 | 亚洲 | 久久蜜桃香蕉精品一区二区三区 | 亚洲免费在线视频 | av在线试看| 国产亚洲精品久久久久久久久久 | 蜜桃久久一区二区三区 | 九九热精品视频在线 | 欧美成人精品一级 | 毛片视频大全 | 九九看片 | 欧美成人精品一区二区男人小说 | 国产黄网| 99在线在线视频免费视频观看 | 国产午夜探花 | 日本黄色a视频 | 久久精品亚洲精品国产欧美kt∨ | 性欧美日本 | 中文字幕欧美视频 | 日韩视频二区 | 黄色视屏免费看 | 成人免费毛片在线观看 | 欧美性生活久久久 | 国产 一区 | 免费一级毛片免费播放 | 国产美女爽到喷白浆的 | 毛片一级免费看 | 国产成人高清成人av片在线看 | 在线播放免费播放av片 | 国产1级视频 | 国产免费一区 | av在线免费播放网站 | 午夜久久久精品一区二区三区 |