使用REXML解析xml
1 Tree Parsing(也就是DOM-like)
我们需要requirerexml/document库,并且includeREXML:require'rexml/document'
includeREXML
input=File.new("books.xml")
doc=Document.new(input)
root=doc.root
putsroot.attributes["shelf"]#RecentAcquisitions
doc.elements.each("library/section"){|e|putse.attributes["name"]}
#Output:
#Ruby
#Space
doc.elements.each("*/section/book"){|e|putse.attributes["isbn"]}
#Output:
#0672328844
#0321445619
#0684835509
#074325631X
sec2=root.elements[2]
author=sec2.elements[1].elements["author"].text#RobertZubrin这里要注意的是xml中的属性和值被表示为一个hash,因此我们能够通过attributes[]来提取我们需要的值,元素的值还能通过类似于path的字符串或者整数来取得.其中用整数取的话,是1-based而不是0-based.
2StreamParsing(也就是SAX-likeParsing)
这边使用了一个小技巧,那就是定义了一个listener类,它将会在parse的时候被回调:require'rexml/document'
require'rexml/streamlistener'
includeREXML
classMyListener
includeREXML::StreamListener
deftag_start(*args)
puts"tag_start:#{args.map{|x|x.inspect}.join(',')}"
end
deftext(data)
returnifdata=http://blog.soso.com/qz.q/~/^/w*$/#whitespaceonly
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)