2012-01-11 71 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