如何从format.xml中删除<hash> </hash>

时间:2012-01-11 12:43:41

标签: ruby-on-rails ruby ruby-on-rails-3.1

我有一个对象,has_many子对象应该呈现为xml。这不是问题。我的问题是我创建了一个包含此数据的Hash,就像解析器需要它一样。但rails使用

自动封闭整个文件
<hash>
    <objects type="array">
        <object>
           ...
           ...
           ...
        </object>
    </objects>
</hash>

我需要摆脱type="array"<hash>如何解决这个问题?我没有在文档上找到任何内容。

3 个答案:

答案 0 :(得分:7)

我遇到了同样的问题;

这是我的XML:

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

我正在使用它:

entries.to_xml

将哈希数据转换为XML,但这会将条目的数据包装到<hash></hash>

所以我修改了:

entries.to_xml(root: "Contacts")

但仍然将转换后的XML包装在“Contacts”中,将我的XML代码修改为

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

所以它增加了额外的ROOT,我不会在那里。

现在解决这个问题的方法是:

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

避免包含<hash></hash>或任何其他根。 干杯!!

答案 1 :(得分:1)

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

答案 2 :(得分:0)

在现实世界中进行实际开发时,有多种原因导致您可能需要XML 的片段,即使您非常清楚实际的XML规范指示单个根。 / p>

但是,ActiveSupport的Hash#to_xml不支持此功能。

这是一个方法(添加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