【问题标题】:How to remove <hash></hash> from format.xml如何从 format.xml 中删除 <hash></hash>
【发布时间】:2012-02-07 19:42:46
【问题描述】:

我有一个对象 has_many 应该呈现为 xml 的子对象。这不是问题。我的问题是我创建了一个Hash,其中包含解析器需要的这些数据。但是rails自动将整个文件包含在

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

我需要摆脱type="array"&lt;hash&gt; 我该如何处理?我没有在文档中找到任何内容。

【问题讨论】:

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


【解决方案1】:

我遇到了同样的问题;

这是我的 XML:

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

我用的是这个:

entries.to_xml

将哈希数据转换为 XML,但这会将条目的数据包装到 &lt;hash&gt;&lt;/hash&gt;

所以我修改了:

entries.to_xml(root: "Contacts")

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

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

所以它添加了一个额外的 ROOT,我不想在那里。

现在对我有用的解决方案是:

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

避免&lt;hash&gt;&lt;/hash&gt; 或任何额外的根被包括在内。 干杯!!

【讨论】:

    【解决方案2】:
    render :xml => @objects.to_xml(:root => :root_name, :skip_types => true)
    

    【讨论】:

    • 现在我的输出 xml 中有标签 ... 不是我阅读问题的意图。 “数组”不见了,但 刚刚重命名.. 它仍然原样。
    • 看起来不错:? [1,2,3].to_xml(:root => :objects, :skip_types => true) => "\n\n 1\n 2\n 3\n\n"
    【解决方案3】:

    在现实世界中进行实际开发时,有多种原因可能需要 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
    

    【讨论】:

      猜你喜欢
      • 2018-08-07
      • 1970-01-01
      • 2019-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-09-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多