国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院

首頁(yè) > 編程 > Ruby > 正文

Ruby程序中創(chuàng)建和解析XML文件的方法

2020-02-24 15:36:39
字體:
供稿:網(wǎng)友

XML是一種可擴(kuò)展的標(biāo)記語(yǔ)言,它允許程序員開發(fā)可以被其他應(yīng)用程序讀取的應(yīng)用程序,而不管所使用的操作系統(tǒng)和開發(fā)語(yǔ)言是什么,那么Ruby程序中創(chuàng)建和解析XML文件的方法有哪些呢?武林技術(shù)頻道帶你了解。

使用builder創(chuàng)建XML

builder安裝方法:

ruby.html="" tags="">ruby;">gem install builder
require 'builder'   x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1) #":target =>$stdout"參數(shù):指示輸出內(nèi)容將被寫向標(biāo)準(zhǔn)輸出控制臺(tái) #":indent =>1"參數(shù):XML輸出形式將被縮進(jìn)一個(gè)空格字符x.instruct! :xml,:version =>'1.1',:encoding => 'gb2312' x.comment! "書本信息"  x.library("shelf" => "Recent Acquisitions") { x.section("name" => "ruby"){ x.book("isbn" => "0672310001"){ x.title "Programming Ruby"  x.author "Yukihiro " x.description "Programming Ruby - The Pragmatic Programmer's Guide" } } } 

p x #打印XML

Ruby創(chuàng)建XML輸出結(jié)果:

< ?xml version="1.1" encoding="gb2312"?> < !-- 書本信息 --> < library shelf="Recent Acquisitions"> < section name="ruby"> < book isbn="0672310001"> < title>Programming Ruby< /title> < author>Yukihiro < /author> < description>Programming Ruby - The Pragmatic Programmer's Guide< /description> < /book> < /section> < /library> < inspect/> #< IO:0x2a06ae8> 

使用ReXML解析XML

REXML 是一個(gè)完全用ruby寫的processor ,他有多種api,其中兩個(gè)經(jīng)典的api是通過DOM-like 和SAX-like 來進(jìn)行區(qū)分的。第一種是將整個(gè)文件讀進(jìn)內(nèi)存,然后存儲(chǔ)為一個(gè)分層的形式(也就是一棵樹了).而第二種是"parse as you go",當(dāng)你的文件很大,并且內(nèi)存受到限制的時(shí)候,比較適合用這種。

看下面的book.xml:

引用

<library shelf="Recent Acquisitions">   <section name="Ruby">     <book isbn="0672328844">     <title>The Ruby Way</title>     <author>Hal Fulton</author>     <description>       Second edition. The book you are now reading.       Ain't recursion grand?     </description>     </book>   </section>   <section name="Space">     <book isbn="0684835509">       <title>The Case for Mars</title>       <author>Robert Zubrin</author>       <description>Pushing toward a second home for the human         race.       </description>     </book>     <book isbn="074325631X">       <title>First Man: The Life of Neil A. Armstrong</title>       <author>James R. Hansen</author>       <description>Definitive biography of the first man on         the moon.       </description>     </book>   </section> </library>


1 Tree Parsing(也就是DOM-like)

我們需要require rexml/document 庫(kù),并且include REXML :

require 'rexml/document' include REXML  input = File.new("books.xml") doc = Document.new(input)  root = doc.root puts root.attributes["shelf"]   # Recent Acquisitions  doc.elements.each("library/section") { |e| puts e.attributes["name"] } # Output: #  Ruby #  Space  doc.elements.each("*/section/book") { |e| puts e.attributes["isbn"] } # Output: #  0672328844 #  0321445619 #  0684835509 #  074325631X  sec2 = root.elements[2] author = sec2.elements[1].elements["author"].text    # Robert Zubrin 


這里要注意的是xml中的屬性和值被表示為一個(gè)hash,因此我們能夠通過attributes[]來提取我們需要的值,元素的值還能通過類似于path的字符串或者整數(shù)來取得.其中用整數(shù)取的話,是1-based而不是0-based.

2? Stream Parsing(也就是SAX-like Parsing)

這邊使用了一個(gè)小技巧,那就是定義了一個(gè)listener 類,它將會(huì)在parse的時(shí)候被回調(diào):

require 'rexml/document' require 'rexml/streamlistener' include REXML  class MyListener  include REXML::StreamListener  def tag_start(*args)   puts "tag_start: #{args.map {|x| x.inspect}.join(', ')}"  end   def text(data)   return if data =~ /^/w*$/   # whitespace only   abbrev = data[0..40] + (data.length > 40 ? "..." : "")   puts " text  :  #{abbrev.inspect}"  end end  list = MyListener.new source = File.new "books.xml" Document.parse_stream(source, list) 


這里介紹一下StreamListener 模塊,這個(gè)模塊它提供了幾個(gè)空的回調(diào)方法,因此你可以為了實(shí)現(xiàn)你自己的功能而覆蓋它.當(dāng)parser 進(jìn)入一個(gè)tag時(shí),就會(huì)調(diào)用tag_start方法.而text方法也是類似的,他只不過是當(dāng)讀取到數(shù)據(jù)時(shí)會(huì)被回調(diào),它的輸出是這樣的:

tag_start: "library", {"shelf"=>"Recent Acquisitions"} tag_start: "section", {"name"=>"Ruby"} tag_start: "book", {"isbn"=>"0672328844"} tag_start: "title", {}  text  :  "The Ruby Way" ......................................... 


3 XPath

REXML通過XPath 類來提供Xpath的支持. 它也同時(shí)支持DOM-like和SAX-like .還是前面的那個(gè)xml文件,我們使用Xpath可以這樣做:

book1 = XPath.first(doc, "http://book")  # Info for first book found p book1  # Print out all titles XPath.each(doc, "http://title") { |e| puts e.text }  # Get an array of all of the "author" elements in the document. names = XPath.match(doc, "http://author").map {|x| x.text } p names 


輸出是類似于下面的:

<book isbn='0672328844'> ... </> The Ruby Way The Case for Mars First Man: The Life of Neil A. Armstrong ["Hal Fulton", "Robert Zubrin", "James R. Hansen"] 

以上就是武林技術(shù)頻道為您介紹的關(guān)于Ruby程序中創(chuàng)建和解析XML文件的方法,希望可以幫助您全面了解編程的相關(guān)知識(shí)。

發(fā)表評(píng)論 共有條評(píng)論
用戶名: 密碼:
驗(yàn)證碼: 匿名發(fā)表

圖片精選

国产激情自拍_国产9色视频_丁香花在线电影小说观看 _久久久久国产精品嫩草影院
国产污视频在线| 精品国产高清a毛片无毒不卡 | 中文字幕在线免费| 青青久在线视频免费观看| 在线免费观看你懂的| 亚洲第一成年免费网站| 国产原创av在线| 国产黄色在线看| wwwww在线观看免费视频| 国产美女福利在线观看| 中文一区在线观看| 欧美韩日国产| 777电影在线观看| 久久久久久久久久久久久91| 国产精品久久精品牛牛影视| xxx国产精品| 精品亚洲综合| 尤物在线视频| 在线播放黄色网址| 国产日产一区二区| 免费观看一二区视频网站| 国产精品久久久久久久久鸭| 久久一本精品| 亚洲精品一区中文字幕电影| 国产香蕉视频在线看| 久久久久久日本一区99| 一个人看的www免费观看视频| 国产在线传媒| 免费黄网站在线观看| 国产黄色免费| 国产一区精品| 午夜伦全在线观看| 另类专区欧美| 2020亚洲男人天堂| 国产日本视频| 国产精品美女一区二区三区四区| 久久久久久五月天久久久久久久久| 国产精品扒开做爽爽爽的视频| 九九热视频精品在线观看| av在线free| av黄色在线观看| 精品a在线观看| 在线中文字幕资源| 精品街拍一区二区| 99re在线视频| 欧美激情福利视频在线观看免费| 亚洲图区欧美| 男人天堂v视频| www.九九热.com| 青青草在线播放| 国产在线观看网站| 天堂资源在线中文| 国产污视频在线| 国产粉嫩一区二区三区在线观看| 91在线最新| 日本视频三区| 最新亚洲精品国自产在线观看| 国产丝袜在线观看视频| 51成人精品网站| 亚洲第一成年免费网站| 国产中文字幕在线视频| 国产娇喘精品一区二区三区图片| 伊人永久在线| 免费a级人成a大片在线观看| 最近中文字幕mv免费高清在线| 国产精品美女一区二区视频| 亚洲视频网站在线| 午夜视频在线| h网站久久久| 国产色a在线| 亚洲欧美精品日韩欧美 | 日韩亚洲一区中文字幕| 国产精品自拍在线观看| 2021av天天| 国产精选在线观看| 在线国产1区| 国产麻豆视频| 在线看黄色av| 国产xxxxx| 国产一二三区在线观看| 免费日本黄色| www.狠狠色.com| 精品国产福利一区二区在线 | 精品国产免费观看一区| 九九热在线观看视频| 在线观看午夜av| 国产成人精品实拍在线| 国产三线在线| 美女免费视频黄| 伊人av免费在线观看| 中文字幕色视频| 懂色av中文在线| 九九在线观看免费视频| 操操操综合网| 蜜桃视频中文字幕| 九九热免费视频| 高清欧美精品xxxxx在线看| 国产在线观看网站| 国内a∨免费播放| 欧美在线中文| 成在在线免费视频| 国产精品臀控福利在线观看| 中文字幕不卡免费视频| 中文字幕视频在线| 国产污视频在线| 国产日韩欧美一区二区三区视频| 国产又色又爽又黄刺激在线视频| 免费av在线| 久久五月精品中文字幕| 国内精品一区视频| 中文字幕在线免费| 精品久久亚洲一级α| eeuss影院在线观看第一页| 日本一二三区视频免费高清| 不卡av免费观看| 国产精品一区二区三区视频网站 | 国产视频中文字幕| 国产经典av| 夜夜操com| 国产专区在线| 国产黄视频网站| www免费在线观看视频| 国产在线视频精品视频免费看| 好男人免费精品视频| 中文字幕不卡| 天堂在线国产| 中文字幕在线视频不卡| 国产xxx在线| 国产有码在线| av首页在线| 国产一级又黄| 伊人影院在线视频| 国产亚洲依依| 欧美日韩性视频一区二区三区| 中文字幕毛片| 免费在线超碰| 中文av在线播放| 国产在线高潮| 亚洲精品视频区| 国产馆av播放| 国产毛片在线| 日本福利午夜视频在线| 国产9色视频| 国产私人尤物无码不卡| 九九99精品| 免费国产阿v视频在线观看| 国产精品69一区二区三区| 超碰在线免费播放| 99在线欧洲视频| 精品国产一区二区三区久久久狼牙| 国内精品免费一区二区三区| 羞羞视频在线观看免费| 99久久国产视频| 国产www在线观看| 国产欧美日韩第一页| 尤物视频在线观看| 国产免费专区| 二区三区中文字幕| 国产美女免费观看| 国产精品一卡二卡三卡| 交换国产精品视频一区| 一区二区精品区| av在线免费播放| 毛片在线视频| 成人欧美精品久久久久影院| 大香伊人中文字幕精品| 国产尤物视频在线| 中文字幕成人乱码在线电影| 99视频资源网| 国产视频青青| 国产二级片在线| 一级二级在线观看| 激情综合网五月激情| 国产一二区视频| 国产粉嫩一区二区三区在线观看| 国产黄色在线网站| 国产精品国产三级国产试看| 国产精品9区| a级在线观看| 国产在线视频福利| 国产a级网站| www在线观看播放免费视频日本| 激情六月婷婷| 国产白浆在线| 牛牛精品视频在线| 国产精品ⅴa有声小说| 日韩亚洲一区中文字幕| 国产理论电影在线| 伊人中文在线| 中文字幕免费在线视频| 在线观看中文字幕| 天堂在线中文| 日本久久国产| 在线天堂视频| 国产青草视频在线观看视频| 免费av在线| 日本天堂影院在线视频| 国产粉嫩一区二区三区在线观看| аⅴ成人天堂中文在线| 国产xxx在线|