On 16.11.2006 23:06, darenbell / gmail.com wrote:
> Sorry for having such a specific question, but is there a simple way to
> take the XML document below and put it into some sort of organized hash
> value without first knowing anything about it?
>
> This is an easy job using something like XML::Simple in Perl, but for
> the life of me, I can't figure out an easy way to do this in Ruby.
>
> I'm thinking of some sort of data structure like so:
>
> environment=>authentication=>adminGroup=>description=>'NULL'
> environment=>authentication=>adminGroup=>dataType=>'NULL'
> environment=>authentication=>adminGroup=>value=>'NULL'
> etc...
> environment=>database=>databaseHost=>description=>'NULL'
> environment=>database=>databaseHost=>dataType=>'NULL'
> etc...
You can easily create nested Hashes with the typical idiom:
irb(main):001:0> miss = lambda {|h,k| h[k] = Hash.new(&miss)}
=> #<Proc:0x003cbaa8@(irb):1>
irb(main):002:0> root = Hash.new(&miss)
=> {}
irb(main):003:0> root[:foo][:bar][:baz] = 10
=> 10
irb(main):004:0> root
=> {:foo=>{:bar=>{:baz=>10}}}
Now you just need a XML stream parser (REXML has one) and fill the Hash
while you go.
But my question to this is, why do you want it in a Hash of Hashes when
there is REXML with an equally easy accessible DOM and which knows more
about the data than nested hashes (order for example)? Also, you can
access nested elements with XPath which is a powerful query language.
Granted, accesses are likely less efficient than with the nested Hash
approach but do you need the speed?
Kind regards
robert