 
 This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
| Converting an XML Document into a Hash | ||
|---|---|---|
| Code | Expected | Actual | 
| xml = %{
<freezer temp="-12" scale="celcius">
 <food>Phyllo dough</food>
 <food>Ice cream</food>
 <icecubetray>
  <cube1 />
  <cube2 />
 </icecubetray>
</freezer>}
require 'rubygems'
require 'xmlsimple'
doc = XmlSimple.xml_in xml
require 'pp'
pp doc | {"icecubetray"=>[{"cube2"=>[{}], "cube1"=>[{}]}],
"food"=>["Phyllo dough", "Ice cream"],
"scale"=>"celcius",
"temp"=>"-12"} | {"icecubetray"=>[{"cube2"=>[{}], "cube1"=>[{}]}],
 "food"=>["Phyllo dough", "Ice cream"],
 "scale"=>"celcius",
 "temp"=>"-12"} | 
| xml = %{
<freezer temp="-12" scale="celcius">
 <item name="Phyllo dough" type="food" />
 <item name="Ice cream" type="food" />
 <item name="Ice cube tray" type="container">
  <item name="Ice cube" type="food" />
  <item name="Ice cube" type="food" />
 </item>
</freezer>}
parsed1 = XmlSimple.xml_in xml
pp parsed1 | {"scale"=>"celcius",
"item"=>
[{"name"=>"Phyllo dough", "type"=>"food"},
{"name"=>"Ice cream", "type"=>"food"},
{"name"=>"Ice cube tray",
"type"=>"container",
"item"=>
[{"name"=>"Ice cube", "type"=>"food"},
{"name"=>"Ice cube", "type"=>"food"}]}],
"temp"=>"-12"} | {"scale"=>"celcius",
 "item"=>
  [{"name"=>"Phyllo dough", "type"=>"food"},
   {"name"=>"Ice cream", "type"=>"food"},
   {"name"=>"Ice cube tray",
    "type"=>"container",
    "item"=>
     [{"name"=>"Ice cube", "type"=>"food"},
      {"name"=>"Ice cube", "type"=>"food"}]}],
 "temp"=>"-12"} | 
| parsed2 = XmlSimple.xml_in(xml, 'KeyAttr' => 'name') pp parsed2 | {"scale"=>"celcius",
"item"=>
{"Phyllo dough"=>{"type"=>"food"},
"Ice cube tray"=>
{"type"=>"container",
"item"=>{"Ice cube"=>{"type"=>"food"}}},
"Ice cream"=>{"type"=>"food"}},
"temp"=>"-12"} | {"scale"=>"celcius",
 "item"=>
  {"Phyllo dough"=>{"type"=>"food"},
   "Ice cube tray"=>
    {"type"=>"container", "item"=>{"Ice cube"=>{"type"=>"food"}}},
   "Ice cream"=>{"type"=>"food"}},
 "temp"=>"-12"} | 
| parsed1["item"].detect { |i| i['name'] == 'Phyllo dough' }['type'] | "food" | "food" | 
| parsed2["item"]["Phyllo dough"]["type"] | "food" | "food" | 
| parsed1["item"] << {"name"=>"Curry leaves", "type"=>"spice"}
parsed1["item"].delete_if { |i| i["name"] == "Ice cube tray" }
puts XmlSimple.xml_out(parsed1, "RootName"=>"freezer") | <freezer scale="celcius" temp="-12"> <item name="Phyllo dough" type="food" /> <item name="Ice cream" type="food" /> <item name="Curry leaves" type="spice" /> </freezer> | <freezer scale="celcius" temp="-12"> <item name="Phyllo dough" type="food" /> <item name="Ice cream" type="food" /> <item name="Curry leaves" type="spice" /> </freezer> | 
| parsed3 = XmlSimple.xml_in(xml, 'KeepRoot'=>true) | Now there's no need to add an extra root element when writing back to XML. | |
| XmlSimple.xml_out(parsed3, 'RootName'=>nil)
pp XmlSimple.xml_in(%{
<freezer temp="-12" scale="celcius">
 <temp>Body of temporary worker who knew too much</temp>
</freezer>}) | {"scale"=>"celcius",
"temp"=>["-12", "Body of temp worker who knew too much"]} | {"scale"=>"celcius",
 "temp"=>["-12", "Body of temporary worker who knew too much"]} |