2009-11-16 34 views
28

Aquí es el XML específico que en última instancia necesito:¿Cómo convierto un hash Ruby a XML?

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <email>[email protected]</email> 
    <first_name>Joe</first_name> 
    <last_name>Blow</last_name> 
</customer> 

Pero decir que tengo un controlador (Ruby on Rails) que es el envío de los datos a un método. Yo prefiero enviarlo como un hash, así:

:first_name => 'Joe', 
:last_name => 'Blow', 
:email => '[email protected]' 

Entonces, ¿cómo puedo convertir el hash a ese formato XML?

Respuesta

63

ActiveSupport agrega un método to_xml en Hash, por lo que puede ser bastante cerca de lo que busca con esto:

my_hash = { :first_name => 'Joe', :last_name => 'Blow', :email => '[email protected]'} 
my_hash.to_xml(:root => 'customer') 

Y termina con:

<?xml version="1.0" encoding="UTF-8"?> 
<customer> 
    <last-name>Blow</last-name> 
    <first-name>Joe</first-name> 
    <email>[email protected]</email> 
</customer> 

Tenga en cuenta que los caracteres de subrayado se convierten en guiones.

+0

Ah, bien, la opción raíz fue lo que me estaba tirando. ¡Gracias! – Shpigford

+0

¿Cómo se pueden agregar atributos a un elemento XML utilizando este método? – doremi

+3

necesitarás: 'sudo gem install activesupport' y en el código' require "active_support/core_ext" 'tener' Hash # to_xml' –

3

Si estos datos son un modelo, observe la anulación to_xml.

De lo contrario, Builder es una buena opción.

+1

Bueno, he intentado con to_xml y está agregando una etiqueta alrededor de mi XML. es decir. ... Shpigford

+0

Está su cliente hash de un registro de objeto activo? – bensie

+1

Consulte http://api.rubyonrails.org/classes/ActiveRecord/Serialization.html#M001876 para obtener información sobre cómo modificar su estructura XML. – bensie

3

Sugeriría una gema como XmlSimple que proporciona este tipo de instalaciones.

+0

Esto funcionó para mí ya que no estoy usando Rails. Aquí hay una línea para hash a xml: 'XmlSimple.xml_out (hash, {: keeproot => true,: noescape => true})' –

2

Hice una breve presentación sobre ese tema en mi universidad hace un tiempo. Here son las diapositivas (la parte interesante comienza en> = página 37)

2

Gema gyoku muy agradable.

Gyoku.xml(:lower_camel_case => "key")  
# => "<lowerCamelCase>key</lowerCamelCase>" 

Gyoku.xml({ :camel_case => "key" }, { :key_converter => :camelcase }) 
# => "<CamelCase>key</CamelCase>" 

Gyoku.xml({ acronym_abc: "value" }, key_converter: lambda { |key| key.camelize(:lower) }) 
# => "<acronymABC>value</acronymABC>" 

y más opciones útiles.

+0

Gran publicación, ¿conoces alguna gema que se convierta en JSON? –

+0

@AlejandroMontilla [Oj] (https://github.com/ohler55/oj) – rojcyk