开发者

On the fly tags generation for XML Builders

开发者 https://www.devze.com 2022-12-21 15:13 出处:网络
I have a hash like, object = { :type => \'book\', :name => \'RoR\', :price => 33 } OR object = { :type => \'wig\', :name => \'Elvis-Style\', :price => 40, :color => \'black\'

I have a hash like,

object = { :type => 'book', :name => 'RoR', :price => 33 }

OR

object = { :type => 'wig', :name => 'Elvis-Style', :price => 40, :color => 'black' }

The problem is that keys in above hash may be different all the time or even increase and decrease depending upon the object type.

What I want to do generate XML for above hashes using Xml::Builder. The XML tags are decided by the keys in the hash and text inside a tag is value corresponding that key.

I can use eval to do this like below. However, I think there must be a bet开发者_JAVA百科ter way to do it.

object.each do |key, text|
  eval("xml.#{key.to_s} do
          #{text}
        end
      ")
end


@object.each do |k, v|
  xml.tag!(k.to_s, v)
end


Rails supports to_xml on Hash classes.

hash = { :type => 'book', :name => 'RoR', :price => 33 }
hash.to_xml
# Returns
# <?xml version=\"1.0\" encoding=\"UTF-8\"?>
# <hash>
#   <type>book</type>
#   <name>RoR</name>
#   <price type=\"integer\">33</price>
# </hash>

If you want to skip the types then:

hash.to_xml(:skip_types => true)

If you want to give a different root then:

hash.to_xml(:root => 'options')


This one worked.

@object.each do |k, v|
  xml.tag!(k.to_s, v)
end


   out << "<#{key}>#{html_escape(value)}</#{key}>"
0

精彩评论

暂无评论...
验证码 换一张
取 消

关注公众号