2010-03-03 2 views
1

У меня есть хэш, как,О порождении мухи тегов для XML строители

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

ИЛИ

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

Проблема заключается в том, что ключи в вышеуказанном хэше могут отличаться все время или даже увеличить и уменьшается в зависимости от типа объекта.

Что я хочу сделать для XML для вышеуказанных хэшей, используя Xml::Builder. Теги XML определяются keys в хеш и text внутри тега - это значение, соответствующее этому ключу.

Я могу использовать eval, чтобы сделать это, как показано ниже. Тем не менее, я думаю, что должен быть лучший способ сделать это.

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

ответ

1

Rails поддерживает to_xml по классам Hash.

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

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

Это было здорово. Однако это не сработало. Тем не менее, это работало. http://pastie.org/851304 – Waseem

1

Это один работал.

@object.each do |k, v| 
    xml.tag!(k.to_s, v) 
end 
Смежные вопросы