Here's some code for your requirement described in your post. It only works for Hash
like XML structures, such as the campaign
node in your sample data. If you want Array
like behavior, you may need to handle them explicitly, as what I did for the campaigns
node.
require 'nokogiri'
def parse(element)
children = element.children.reject{|e| e.is_a?(Nokogiri::XML::Text) && e.text =~ /^\s*$/}
if children.count == 1 && children[0].is_a?(Nokogiri::XML::Text)
children[0].text
else
data = Hash.new
children.each do |child|
data[child.name] = parse(child)
end
data
end
end
doc = Nokogiri::XML(open('data.xml')) # suppose the xml is stored in data.xml
campaigns = doc.xpath('/response/campaigns/campaign').map{|c| parse(c)}
p campaigns