From: aidy Date: 2008-07-01T02:12:22+09:00 Subject: Re: is it possible to create a hash dynamically? On 30 Jun, 17:46, Stefano Crocco wrote: > On Monday 30 June 2008, aidy wrote: > > > The problem is in the line > > @xml_data = {node.name => node.text} > > At each iteration, you discard the old content of the variable and replace it > with a new hash. This way, at the end of the cycle, the @xml_data will be a > hash containing only the text of the last node. > > To do what you want, you should set @xml_data to an empty hash outside the > outer each, then store the new node in the hash at each iteration: > > def extract(xml, path) >   require 'rexml/document' >   xml = xml.to_s.gsub("utf-16", "utf-8") >   doc = REXML::Document.new(xml) >   @xml_data = {} >   doc.root.each_element(path) do |element| >       element.each_element do |node| >       puts "name: #{node.name} text: #{node.text}" >       @xml_data[node.name] => node.text} >     end >   end >   return @xml_data > end > > By the way, are you sure @xml_data needs to be an instance variable? From the > way you use it in the piece of code you posted, it seems it should be a local > variable. > > I hope this helps > > Stefano- Hi Stefano, Thanks for getting back, but there seems to be a syntax error here: @xml_data[node.name] => node.text} I have tried this, def extract(xml, path) require 'rexml/document' xml = xml.to_s.gsub("utf-16", "utf-8") doc = REXML::Document.new(xml) @xml_data = {} doc.root.each_element(path) do |element| element.each_element do |node| puts "name: #{node.name} text: #{node.text}" @xml_data[node.name] = node.text end end return @xml_data end but still get one element in @xml_data Regards Aidy