2012-01-11 46 views
5

我有一个对象has_many应该呈现为xml的子对象。这不是问题。我的问题是,我创建了一个包含解析器所需的数据的Hash。但导轨atomaticly封闭与如何从format.xml中删除<hash></hash>

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

我需要摆脱type="array"<hash>我怎么能处理这整个文件?我没有找到任何文件。

+0

您是否尝试过'to_xml'方法? http://stackoverflow.com/questions/1739905/how-do-i-convert-a-ruby-hash-to-xml – jibiel 2012-01-11 13:02:01

+1

看起来像这是你的情况http://stackoverflow.com/questions/6241911/rails -rendering-xml-adds-hash-tag – jibiel 2012-01-11 13:05:46

+0

谢谢你做了一部分,我发现我自己的其余部分=>':skip_types => true' – davidb 2012-01-11 13:41:32

回答

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

现在我的标签在我的输出xml中...不是我读过的问题的意图。 “阵列”消失了,但只是重命名..它仍然是那里。 – baash05 2012-11-27 00:58:24

+0

看起来不错:? [1,2,3] .to_xml(:root =>:objects,:skip_types => true) =>“<?xml version = \”1.0 \“encoding = \”UTF-8 \“?> \ n \ n \ n \ n \ n \ n“个 – Anno2001 2013-02-06 18:51:07

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代码的转换XML到

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

所以这增加了额外的ROOT,我不wan't那里。

现在解决这个什么工作对我来说是:

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

避免<hash></hash>或任何额外的根被包括在内。 干杯!

0

在现实世界中进行实际开发时,出于多种原因,即使您完全清楚实际的XML规范指定了单个根,为什么还需要XML的片段

但是,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