2012-01-11 19 views
5

Tengo un objeto que has_many objetos secundarios que deberían representarse como xml. Esto no es un problema. Mi problema es que creo un Hash que contiene esta información, como el analizador lo necesita. Pero carriles atomaticly encierra todo el archivo conCómo eliminar <hash></hash> de format.xml

<hash> 
    <objects type="array"> 
     <object> 
      ... 
      ... 
      ... 
     </object> 
    </objects> 
</hash> 

necesito para deshacerse de la type="array" y la <hash> cómo puedo manejar esto? No encontré nada en la documentación.

+0

¿Has probado método 'to_xml'? http://stackoverflow.com/questions/1739905/how-do-i-convert-a-ruby-hash-to-xml – jibiel

+1

Parece que este es exactamente tu caso http://stackoverflow.com/questions/6241911/rails -rendering-xml-adds-hash-tag – jibiel

+0

Gracias que hizo una parte encontré el resto por mi cuenta => ': skip_types => true' – davidb

Respuesta

1
render :xml => @objects.to_xml(:root => :root_name, :skip_types => true) 
+0

Ahora tengo la etiqueta en mi salida xml ... No es la intención de la pregunta cuando la leí. La "matriz" se ha ido, pero se acaba de renombrar ... sigue igual que allí. – baash05

+0

se ve bien :? [1,2,3] .to_xml (: root =>: objects,: skip_types => true) => " \ N \ n \ n \ n \ n \ n " – Anno2001

7

Estaba teniendo el mismo problema;

Esta es mi XML:

<?xml version="1.0" encoding="UTF-8"?> 
<Contacts> 
    <Contact type="array"> 
    </Contact> 
</Contacts> 

que estaba usando esto:

entries.to_xml 

para convertir los datos de hash en XML, pero esto envuelve datos de entradas en <hash></hash>

Así que he modificado :

entries.to_xml(root: "Contacts") 

pero que todavía envuelve el código XML convertido en 'Contactos' modificar mi código XML para

<Contacts> 
<Contacts> 
    <Contact type="array"> 
    <Contact> 
    <Name></Name> 
    <Email></Email> 
    <Phone></Phone> 
    </Contact> 
    </Contact> 
</Contacts> 
</Contacts> 

lo que añade una raíz extra que no wa no existe.

Ahora solución a este lo que funcionó para mí es:

entries["Contacts"].to_xml(root: "Contacts") 

que evita <hash></hash> o cualquier raíz adicionales que deban incluirse. ¡Saludos!

0

Hay una variedad de razones cuando se hace el desarrollo real en el mundo real de por qué es posible que tenga fragmentos de XML incluso si usted es perfectamente consciente de que la especificación XML real dicta una sola raíz.

Sin embargo, el Hash#to_xml de ActiveSupport no es compatible con esto.

Aquí es un método que (añadir en config/initializers/rootless_xml.rb):

class Hash 
    def to_rootless_xml(options = {}) 
    require 'active_support/builder' unless defined?(Builder) 

    options = options.dup 
    options[:indent] ||= 2 
    options[:root] ||= 'hash' 
    options[:builder] ||= Builder::XmlMarkup.new(indent: options[:indent]) 

    builder = options[:builder] 
    builder.instruct! unless options.delete(:skip_instruct) 


    each { |key, value| ActiveSupport::XmlMini.to_tag(key, value, options) } 
    yield builder if block_given? 
    builder.target! 
    end 
end