为XML Builders提供动态标记生成

时间:2010-03-03 04:25:03

标签: ruby-on-rails xml ruby

我有一个哈希,

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

OR

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

问题是上面哈希中的键可能一直不同,甚至根据对象类型增加和减少。

我想要做的是使用Xml::Builder为上面的哈希生成XML。 XML标记由散列中的keys决定,标记内的text是与该键对应的值。

我可以使用eval执行此操作,如下所示。但是,我认为必须有更好的方法来实现它。

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

4 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:1)

这个有效。

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

答案 2 :(得分:1)

Rails在Hash类上支持to_xml

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>

如果您想跳过这些类型:

hash.to_xml(:skip_types => true)

如果你想给一个不同的根,那么:

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

答案 3 :(得分:-1)

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