Ruby 使用 XML
上節(jié)我們介紹了 JSON,本章節(jié)主要介紹一下 Ruby 中如何使用 XML。
1. 什么是 XML
可擴(kuò)展標(biāo)記語(yǔ)言(英語(yǔ):Extensible Markup Language,簡(jiǎn)稱為 XML)是一種標(biāo)記語(yǔ)言。標(biāo)記指計(jì)算機(jī)所能理解的信息符號(hào),通過(guò)此種標(biāo)記,計(jì)算機(jī)之間可以處理包含各種信息的文章等。
XML 跟 HTML 語(yǔ)言很類似,但是不同的是,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 來(lái)操作 XML
2.1 使用Ruby來(lái)解析XML
我們將上面的例子放到一個(gè)price_list.xml文件中去。
解析文件要使用到 XPath。XPath 使用路徑表達(dá)式來(lái)選擇 XML 文檔中的節(jié)點(diǎn),下面是一些 XPath 的基本規(guī)則:
| 表達(dá)式 | 描述 |
|---|---|
| nodename | 選擇所有名稱為“nodename“的節(jié)點(diǎn) |
| / | 從根節(jié)點(diǎn)選擇 |
| // | 從當(dāng)前節(jié)點(diǎn)中選擇匹配選擇的節(jié)點(diǎn),無(wú)論它們?cè)诤翁?/td> |
| . | 選擇當(dāng)前節(jié)點(diǎn) |
| … | 選擇當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
| @ | 選擇屬性 |
下面給出了一些例子來(lái)理解XPath:
| 表達(dá)式 | 時(shí)機(jī)簡(jiǎn)介(調(diào)用的時(shí)機(jī)) |
|---|---|
| bookstore | 選擇所有名稱為“bookstore”的節(jié)點(diǎn) |
| /bookstore | 選擇根元素bookstore。注意:如果路徑以斜杠(/)開頭,則始終表示元素的絕對(duì)路徑 |
| bookstore/book | 選擇所有屬于bookstore子級(jí)的book元素 |
| //book | 選擇所有書籍元素,無(wú)論它們?cè)谖臋n中的位置如何 |
| bookstore//book | 選擇作為bookstore元素后代的所有book元素,無(wú)論它們?cè)赽ookstore元素下的位置如何 |
| //@lang | 選擇所有名為lang的屬性 |
下面是XPath謂詞(Predicates)的使用方法:
| 表達(dá)式 | 時(shí)機(jī)簡(jiǎn)介(調(diào)用的時(shí)機(jī)) |
|---|---|
| /bookstore/book[1] | 選擇第一個(gè)book元素,它是bookstore元素的子元素。 |
| /bookstore/book[last()] | 選擇作為bookstore元素的子元素的最后一個(gè)book元素 |
| /bookstore/book[last()-1] | 選擇倒數(shù)第二個(gè)book元素,它是bookstore元素的子元素 |
| /bookstore/book[position()<3] | 選擇作為bookstore元素的子元素的前兩個(gè)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元素的價(jià)格大于35.00。 |
現(xiàn)在讓我們打印出所有手機(jī)品牌的價(jià)格信息,在和 price_list.xml 同一目錄下創(chuàng)建腳本,這里我們會(huì)使用到rexml/document庫(kù)。
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"
解釋:
我們通過(guò)XPath.each獲取所有g(shù)oods元素,然后對(duì)這個(gè)結(jié)果進(jìn)行迭代,迭代后每一個(gè)goods元素中的elements方法可以獲取到goods的每個(gè)子節(jié)點(diǎn)。使用[key]獲取每個(gè)節(jié)點(diǎn),輸出它然后再使用text方法輸出其中的字符串。
2.2 使用 Ruby 生成 XML 文件
生成XML我們要使用builder庫(kù)。
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>
之后如果需要的話將這個(gè) XML 寫入到文件中即可。
3. 小結(jié)
本章節(jié)我們了解了什么是 XML,XPath 的基本規(guī)則有哪些,在 Ruby 中使用 XPath 解析到元素。使用builder創(chuàng)建一個(gè) XML 文件。
杜驍 ·
2025 imooc.com All Rights Reserved |