JSON与XML处理 #
JSON #
require 'rubygems'
require 'json'
json = <<ST
{
"data": [
{
"code": "404",
"value": "not found"
},
{
"code": "302",
"value": "redirect"
}
]
}
ST
obj = JSON.parse(json)
puts obj['data'][0]['code']
XML #
Dom #
解析 XML #
创建 Document
Document 可以使用文件或字符串进行创建
file = File.new('path')
Document.new(file)
content = '<a></a>'
Document.new(content)
解析 XML
require 'rexml/document'
include REXML
xmlfile=<<ST
<langs type='current'>
<language>Java</language>
<language>Groovy</language>
<language>Scala</language>
<language>Kotlin</language>
</langs>
ST
xmldoc = Document.new(xmlfile)
root = xmldoc.root
puts "Root element : " + root.attributes["type"]
xmldoc.root.elements.each('language') { |e|
puts e.text
}
XPath #
获取第一个元素
langs = XPath.first(xmldoc, "//langs//language")
puts "langs:\n #{langs}"
遍历标签
XPath.each(langs, "//language") { |e| puts "type: #{e.text}" }
查找标签
names = XPath.match(xmldoc, "//language").map { |x| "language #{x.text}" }
puts names
Sax #
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("movies.xml")
Document.parse_stream(xmlfile, list)