2010-03-03 9 views
1

我有一個哈希一樣,在飛標籤生成的XML建設者

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 

回答

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') 
+0

此方法是否適用於從xml對象發出標籤,而不是輸出完整的xml文件? – mwfearnley 2016-03-31 11:57:58

-1
out << "<#{key}>#{html_escape(value)}</#{key}>" 
2
@object.each do |k, v| 
    xml.tag!(k.to_s, v) 
end 
+0

這是偉大的。但它沒有正常工作。這個雖然工作。 http://pastie.org/851304 – Waseem 2010-03-03 08:25:54

1

這一個工作。

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