How do I convert an XML body to a hash in Ruby?
I have an XML body which I\'d like to parse into a hash
I used to use XML::Simple in Perl because parsing XML using Perl was a PITA.
When I switched to Ruby I ended up using Nokogiri, and found it to be very easy to use for parsing HTML and XML. It's so easy that I think in terms of CSS or XPath selectors and don't miss a XML-to-hash converter.
require 'ap'
require 'date'
require 'time'
require 'nokogiri'
xml = %{
2010-11-10T09:00:00
2010-11-10T09:20:00
2010-11-10T09:20:00
2010-11-10T09:40:00
2010-11-10T09:40:00
2010-11-10T10:00:00
2010-11-10T10:00:00
2010-11-10T10:20:00
2010-11-10T10:40:00
2010-11-10T11:00:00
}
time_data = []
doc = Nokogiri::XML(xml)
doc.search('//TIME_DATA').each do |t|
start_time = t.at('StartTime').inner_text
end_time = t.at('EndTime').inner_text
time_data << {
:start_time => DateTime.parse(start_time),
:end_time => Time.parse(end_time)
}
end
puts time_data.first[:start_time].class
puts time_data.first[:end_time].class
ap time_data[0, 2]
with the output looking like:
DateTime
Time
[
[0] {
:start_time => #,
:end_time => 2010-11-10 09:20:00 -0700
},
[1] {
:start_time => #,
:end_time => 2010-11-10 09:40:00 -0700
}
]
The time values are deliberately parsed into DateTime and Time objects to show that either could be used.