我有一个对象,has_many
子对象应该呈现为xml。这不是问题。我的问题是我创建了一个包含此数据的Hash
,就像解析器需要它一样。但rails使用
<hash>
<objects type="array">
<object>
...
...
...
</object>
</objects>
</hash>
我需要摆脱type="array"
和<hash>
如何解决这个问题?我没有在文档上找到任何内容。
答案 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