第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

Ruby 使用 XML

上節(jié)我們介紹了 JSON,本章節(jié)主要介紹一下 Ruby 中如何使用 XML。

1. 什么是 XML

可擴展標(biāo)記語言(英語:Extensible Markup Language,簡稱為 XML)是一種標(biāo)記語言。標(biāo)記指計算機所能理解的信息符號,通過此種標(biāo)記,計算機之間可以處理包含各種信息的文章等。

XML 跟 HTML 語言很類似,但是不同的是,XML 是為了傳輸數(shù)據(jù)而存在的而不是顯示數(shù)據(jù),它具有一定的自我描述性。

常見的 XML 例子:

<priceList>
  <goods good_id="1">
    <name>小米</name>
    <price>1999</price>
  </goods>
  <goods good_id="2">
    <name>華為</name>
    <price>2999</price>
  </goods>
  <goods good_id="3">
    <name>蘋果</name>
    <price>5999</price>
  </goods>
</priceList>
 

2. 使用 Ruby 來操作 XML

2.1 使用Ruby來解析XML

我們將上面的例子放到一個price_list.xml文件中去。

解析文件要使用到 XPath。XPath 使用路徑表達式來選擇 XML 文檔中的節(jié)點,下面是一些 XPath 的基本規(guī)則:

表達式 描述
nodename 選擇所有名稱為“nodename“的節(jié)點
/ 從根節(jié)點選擇
// 從當(dāng)前節(jié)點中選擇匹配選擇的節(jié)點,無論它們在何處
. 選擇當(dāng)前節(jié)點
選擇當(dāng)前節(jié)點的父節(jié)點
@ 選擇屬性

下面給出了一些例子來理解XPath

表達式 時機簡介(調(diào)用的時機)
bookstore 選擇所有名稱為“bookstore”的節(jié)點
/bookstore 選擇根元素bookstore。注意:如果路徑以斜杠(/)開頭,則始終表示元素的絕對路徑
bookstore/book 選擇所有屬于bookstore子級的book元素
//book 選擇所有書籍元素,無論它們在文檔中的位置如何
bookstore//book 選擇作為bookstore元素后代的所有book元素,無論它們在bookstore元素下的位置如何
//@lang 選擇所有名為lang的屬性

下面是XPath謂詞Predicates)的使用方法:

表達式 時機簡介(調(diào)用的時機)
/bookstore/book[1] 選擇第一個book元素,它是bookstore元素的子元素。
/bookstore/book[last()] 選擇作為bookstore元素的子元素的最后一個book元素
/bookstore/book[last()-1] 選擇倒數(shù)第二個book元素,它是bookstore元素的子元素
/bookstore/book[position()<3] 選擇作為bookstore元素的子元素的前兩個book元素
//title[@lang] 選擇所有具有名為lang的屬性的title元素
//title[@lang=‘en’] 選擇所有具有“l(fā)ang”屬性且值為“en”的title元素
/bookstore/book[price>35.00] 選擇bookstore元素中所有price元素大于35.00的book元素
/bookstore/book[price>35.00]/title 選擇bookstore元素的book元素的所有title元素,它們的price元素的價格大于35.00。

現(xiàn)在讓我們打印出所有手機品牌的價格信息,在和 price_list.xml 同一目錄下創(chuàng)建腳本,這里我們會使用到rexml/document庫。

require 'rexml/document'
include REXML

xmlfile = File.new("price_list.xml")
xmldoc = Document.new(xmlfile)


XPath.each(xmldoc, '//priceList/goods').each do |good|
  p good.elements["name"].text
  p good.elements["price"].text
end

# ---- 輸出結(jié)果 ---
"小米"
"1999"
"華為"
"2999"
"蘋果"
"5999"

解釋:

我們通過XPath.each獲取所有g(shù)oods元素,然后對這個結(jié)果進行迭代,迭代后每一個goods元素中的elements方法可以獲取到goods的每個子節(jié)點。使用[key]獲取每個節(jié)點,輸出它然后再使用text方法輸出其中的字符串。

2.2 使用 Ruby 生成 XML 文件

生成XML我們要使用builder庫。

require 'builder'

def product_xml
  xml = Builder::XmlMarkup.new( :indent => 2 ) 
  xml.instruct! :xml, :encoding => "ASCII"
  xml.product do |p| 
    p.name "Test XML"
  end 
end

puts product_xml

# ---- 輸出結(jié)果 ---
<?xml version="1.0" encoding="ASCII"?>
<product>
  <name>Test XML</name>
</product>

之后如果需要的話將這個 XML 寫入到文件中即可。

3. 小結(jié)

本章節(jié)我們了解了什么是 XML,XPath 的基本規(guī)則有哪些,在 Ruby 中使用 XPath 解析到元素。使用builder創(chuàng)建一個 XML 文件。