Hash.from_xml will unescape entities in the actual content values rather than returning the original values.
This is because typecast_xml_value calls translate_xml_entities on values even though XmlSimple already did the unescaping.
Simple test:
>> address = { 'in_xml' => '<intersection>Fourth & Main</intersection>' }
=> {"in_xml"=>"<intersection>Fourth & Main</intersection>"}
>> Hash.from_xml(address.to_xml)['hash']
=> {"in_xml"=>"<intersection>Fourth & Main</intersection>"}
As you can see, trying to store actual XML inside a hash will fail because the from_xml double-unescaping will turn it into invalid XML.