XML是可延伸的標示語言,如HTML。它允許程式員開發可以被其他應用程式讀取的應用程式,而不管使用的是什麼作業系統和開發語言。
它可用於儲存中小型資料量,不用在後端有任何基於SQL的技術。
REXML是一個純Ruby的XML處理器。 它表示一個完整的XML文件,包括PI,doctype等。一個XML文件有一個可以由root()
存取的單個子物件。 如果想要為建立的文件提供XML宣告,則必須自己新增一個。 REXML文件不為您寫入預設宣告。
REXML靈感來自於Java的Electric XML庫。 它的API易於使用,體積小巧,並遵循Ruby方法的方法命名和程式碼流。
它支援樹和流文件解析。 Steam
解析比樹解析快1.5
倍。 但是,在流解析中無法存取某些功能(如XPath)。
現在,從解析XML文件開始,下面是一個範例程式碼:
require "rexml/document"
file = File.new( "trial-1.xml" )
doc = REXML::Document.new file
在上面的程式碼中,第3
行用於解析提供的檔案。
範例
require 'rexml/document'
# file : rexml-example.rb
include REXML
file = File.new("trial-1.xml")
doc = Document.new(file)
puts docs
在上面的程式碼中,require
語句載入了REXML庫。 然後包括REXML表示不必使用像REXML:: Document
這樣的名稱。建立了trial-1.xml
檔案。並將文件顯示在螢幕上。
F:\worksp\ruby>ruby rexml-example.rb
<?xml version='1.0' encoding='UTF-8'?>
<root>
Hello, this is first REXML use.
</root>
F:\worksp\ruby>
Document.new
方法將IO
,String
物件或Document
作為引數。此引數指定必須讀取XML文件的內容。
如果Document建構函式使用Document
作為引數,則將其所有元素節點克隆到新的Document物件。 如果建構函式接受一個String引數,則字串將包含一個XML文件。
這裡文件(「Here Document」)是一種指定文字塊,保留換行符,空格或使用文字標識的方法。
使用「<<
」命令後跟令牌字串構建文件。
在Ruby中,「<<
」和令牌字串之間不應有空格。
範例
#!/usr/bin/env ruby
# file : rexml-heredoc.rb
require 'rexml/document'
include REXML
info = <<XML
<info>
<name>Maxsu</name>
<street>人民大道</street>
<city>海口</city>
<contact>9854126575</contact>
<country>中國</country>
</info>
XML
document = Document.new( info )
puts document
執行上面程式碼,得到以下結果 -
F:\worksp\ruby>ruby rexml-heredoc.rb
<info>
<name>Maxsu</name>
<street>人民大道</street>
<city>海口</city>
<contact>9854126575</contact>
<country>中國</country>
</info>
F:\worksp\ruby>
在這裡,在這裡使用文件資訊。 包括<<EOF
和EOF
之間的所有字元都是資訊的一部分。
對於XML解析範例,使用以下XML檔案程式碼作為輸入:
執行上面程式碼,得到以下結果 -
#!/usr/bin/ruby -w
require 'rexml/document'
# file : rexml-newxml.rb
include REXML
xmlfile = File.new("trial-2.xml")
xmldoc = Document.new(xmlfile)
# Now get the root element
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]
# This will output all the cloth titles.
xmldoc.elements.each("collection/clothing"){
|e| puts "cloth Title : " + e.attributes["title"]
}
# This will output all the cloth types.
xmldoc.elements.each("collection/clothing/type") {
|e| puts "cloth Type : " + e.text
}
# This will output all the cloth description.
xmldoc.elements.each("collection/clothing/description") {
|e| puts "cloth Description : " + e.text
}
這裡演示以樹形解析XML資料。 將以上檔案trial.xml
程式碼作為輸入。
#!/usr/bin/ruby -w
require 'rexml/document'
include REXML
xmlfile = File.new("trial.xml")
xmldoc = Document.new(xmlfile)
# Now get the root element
root = xmldoc.root
puts "Root element : " + root.attributes["shelf"]
# This will output all the cloth titles.
xmldoc.elements.each("collection/clothing"){
|e| puts "cloth Title : " + e.attributes["title"]
}
# This will output all the cloth types.
xmldoc.elements.each("collection/clothing/type") {
|e| puts "cloth Type : " + e.text
}
# This will output all the cloth description.
xmldoc.elements.each("collection/clothing/description") {
|e| puts "cloth Description : " + e.text
}
這裡演示以流的方式解析XML資料。 將檔案trial.xml
程式碼作為輸入。 在這裡將定義一個偵聽器類,其方法將被解析器的回撥目標。
建議不要對小檔案使用類似SAX的解析。
#!/usr/bin/ruby -w
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
xmlfile = File.new("trial.xml")
Document.parse_stream(xmlfile, list)