一、基礎語法
1.直接以字符串形式獲取nokogiri對象:
html_doc = Nokogiri::HTML("html>body>h1>Mr. Belvedere Fan Club/h1>/body>/html>")
xml_doc = Nokogiri::XML("root>aliens>alien>name>Alf/name>/alien>/aliens>/root>")
這里的html_doc和xml_doc就是nokogiri文件
2.也可以通過文件句柄獲取nokogiri對象:
f = File.open("blossom.xml")
doc = Nokogiri::XML(f)
f.close
3.還可以直接從網(wǎng)站獲取:
require 'open-uri'
doc = Nokogiri::HTML(open("http://www.xxx.com/"))
二、XML文件解析實例
從XML/HTML文件里抓取字段的常用方法:
現(xiàn)在有一個名為shows.xml的文件,內(nèi)容如下:
root>
sitcoms>
sitcom>
name>Married with Children/name>
characters>
character>Al Bundy/character>
character>Bud Bundy/character>
character>Marcy Darcy/character>
/characters>
/sitcom>
sitcom>
name>Perfect Strangers/name>
characters>
character>Larry Appleton/character>
character>Balki Bartokomous/character>
/characters>
/sitcom>
/sitcoms>
dramas>
drama>
name>The A-Team/name>
characters>
character>John "Hannibal" Smith/character>
character>Templeton "Face" Peck/character>
character>"B.A." Baracus/character>
character>"Howling Mad" Murdock/character>
/characters>
/drama>
/dramas>
/root>
如果想把所有character標簽的內(nèi)容查找出來,可以這樣處理:
@doc = Nokogiri::XML(File.open("shows.xml"))
@doc.xpath("http://character")
xpath和css方法,返回的是一個結點列表,類似于一個數(shù)組,它的內(nèi)容就是從文件中查找出來的符合匹配規(guī)則的結點.
把dramas結點里的character結點列表查出來:
@doc.xpath("http://dramas//character")
更有可讀性的css方法:
characters = @doc.css("sitcoms name")
# => ["name>Married with Children/name>", "name>Perfect Strangers/name>"]
當已知查詢結果唯一時,如果想直接返回這個結果,而不是列表,可以直接使用at_xpath或at_css:
@doc.css("dramas name").first # => "name>The A-Team/name>"
@doc.at_css("dramas name") # => "name>The A-Team/name>"
三、Namespaces
對于有多個標簽的情況,命名空間就起到非常大的作用了.
例如有這樣一個parts.xml文件:
parts>
!-- Alice's Auto Parts Store -->
inventory xmlns="http://alicesautoparts.com/">
tire>all weather/tire>
tire>studded/tire>
tire>extra wide/tire>
/inventory>
!-- Bob's Bike Shop -->
inventory xmlns="http://bobsbikes.com/">
tire>street/tire>
tire>mountain/tire>
/inventory>
/parts>
可以使用唯一的URL作為namespaces,以區(qū)分不同的tires標簽:
@doc = Nokogiri::XML(File.read("parts.xml"))
car_tires = @doc.xpath('//car:tire', 'car' => 'http://alicesautoparts.com/')
bike_tires = @doc.xpath('//bike:tire', 'bike' => 'http://bobsbikes.com/')
為了讓namespace的使用更方便,nokogiri會自動綁定在根結點上找到的合適的任何namespace.
nokogiri會自動關聯(lián)提供的URL,這個慣例可以減少代碼量.
例如有這樣一個atom.xml文件:
feed xmlns="http://www.w3.org/2005/Atom">
title>Example Feed/title>
link />
updated>2003-12-13T18:30:02Z/updated>
author>
name>John Doe/name>
/author>
id>urn:uuid:60a76c80-d399-11d9-b93C-0003939e0af6/id>
entry>
title>Atom-Powered Robots Run Amok/title>
link />
id>urn:uuid:1225c695-cfb8-4ebb-aaaa-80da344efa6a/id>
updated>2003-12-13T18:30:02Z/updated>
summary>Some text./summary>
/entry>
/feed>
遵循上面提到的慣例,xmlns已被自動綁定,不用再手動為xmlns賦值:
@doc.xpath('//xmlns:title')
# => ["title>Example Feed/title>", "title>Atom-Powered Robots Run Amok/title>"]
同樣情況,css的用法:
并且在使用css方式時,如果namespaces名字是xmlns,那么連這個詞本身都可以忽略掉:
您可能感興趣的文章:- Ruby中使用Nokogiri包來操作XML格式數(shù)據(jù)的教程
- Ruby中XML格式數(shù)據(jù)處理庫REXML的使用方法指南
- 實例解析Ruby程序中調(diào)用REXML來解析XML格式數(shù)據(jù)的用法
- Ruby使用REXML庫來解析xml格式數(shù)據(jù)的方法
- Ruby程序中創(chuàng)建和解析XML文件的方法
- 在Ruby中處理XML和XSLT以及XPath的簡單教程