如何在Rails中将哈希数组转换为XML?

时间:2016-11-30 17:59:03

标签: ruby-on-rails ruby xml

我有一组数据库对象@configs,我想将其转换为XML格式,但输出不是预期的。每个条目都包含在<map>标记中,而不是<entry>标记中,我只希望<tag>成为XML根。如何使用<tag>根构建XML并将所有条目放在<entry>标记中? 提前感谢您的帮助和时间!

这是我的代码:

    entries = Array.new
    entry = Hash.new
    conf = Hash.new  

    @configs.each do |config|

      entry.store('string', config.key)

      conf.store('value', config.value)
      conf.store('comment', config.comment)

      entry.store('com.mirth.connect.util.ConfigurationProperty', conf)

      entries << entry    

    end

    pp entries.to_xml(:root => 'map', :indent => 0, :skip_types => true)

结果是:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<map>
    <map>
        <string>PNB_ALERTLOG_RECEIVER_CHANNEL</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>PNB_ALERTLOG_RECEIVER</value>
            <comment>Canal que irá receber tudo o que for logged com Warning e Error</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </map>
    <map>
        <string>PNB_CFG_FILE_ACCESS_CONTROL</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/pnbAccessControl.json</value>
            <comment>Este ficheiro permite configurar Autenticação e Controlo de Acessos.</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </map>
    <map>
        <string>PNB_CFG_FILE_CONNECTION_POOLS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/pnbConnectionPools.json</value>
            <comment>Configuração de Oracle Universal Connection Pools usadas pelo PNB (PEM, RCU2)</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </map>
    <map>
        <string>PNB_CFG_FILE_CSP_MC_EXCLUSIONS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/medCronExclusions/mcExclCurrentRevision.json</value>
            <comment>N/A</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </map>
    <map>
        <string>PNB_CFG_FILE_FACILITIES_ALIAS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/snsFacilitiesAlias.json</value>
            <comment>Mapa de alias do codigo das instituicoes do SNS.</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </map>
</map>

我想要的是什么:

<?xml version=\"1.0\" encoding=\"UTF-8\"?>
<map>
    <entry>
        <string>PNB_ALERTLOG_RECEIVER_CHANNEL</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>PNB_ALERTLOG_RECEIVER</value>
            <comment>Canal que irá receber tudo o que for logged com Warning e Error</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </entry>
    <entry>
        <string>PNB_CFG_FILE_ACCESS_CONTROL</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/pnbAccessControl.json</value>
            <comment>Este ficheiro permite configurar Autenticação e Controlo de Acessos.</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </entry>
    <entry>
        <string>PNB_CFG_FILE_CONNECTION_POOLS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/pnbConnectionPools.json</value>
            <comment>Configuração de Oracle Universal Connection Pools usadas pelo PNB (PEM, RCU2)</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </entry>
    <entry>
        <string>PNB_CFG_FILE_CSP_MC_EXCLUSIONS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/medCronExclusions/mcExclCurrentRevision.json</value>
            <comment>N/A</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </entry>
    <entry>
        <string>PNB_CFG_FILE_FACILITIES_ALIAS</string>
        <com.mirth.connect.util.ConfigurationProperty>
            <value>resources/configPnbDev/snsFacilitiesAlias.json</value>
            <comment>entrya de alias do codigo das instituicoes do SNS.</comment>
        </com.mirth.connect.util.ConfigurationProperty>
    </entry>
</map>

2 个答案:

答案 0 :(得分:3)

试试这个:

    pp entries.to_xml(:root => 'map', :children => 'entry', :indent => 0, :skip_types => true)

来源:http://apidock.com/rails/Array/to_xml

答案 1 :(得分:1)

假设条目是以下哈希:

entry = {
  a: “hello”,
  b: “goodbye”,
}

如果你写:

entries = []
entries << entry
p entries

然后输出是:

[{:a => “hello”, {:b => “goodbye”}]

所以如果你那么写:

p entries.to_xml

您如何假设“输入”一词会出现在输出中?这有点像期待输出:

x = 10
y = 20
puts x+y

包括字母&#34; x&#34;和&#34; y&#34;某处。

根据数组的to_xml()文档:

  

通过在每个元素上调用to_xml来返回字符串....   选项哈希向下传递。
  http://apidock.com/rails/Array/to_xml

选项哈希向下传递这一事实意味着当您为数组上的to_xml()调用指定{root: map}时,<map>将成为xml的根,并且当{{在每个数组元素上调用1}},使用选项to_xml()调用该方法,这将导致每个数组元素都包含在{root: “map”}标记中。例如:

<map>

嵌套puts [{a: 10, b: 20}, {a: 100, b: 200}].to_xml({root: "map"}) --output:-- <?xml version="1.0" encoding="UTF-8"?> <map type="array"> <map> <a type="integer">10</a> <b type="integer">20</b> </map> <map> <a type="integer">100</a> <b type="integer">200</b> </map> </map> 标记是to_xml()方法中内置功能的副作用:如果在数组上调用to_xml()时为:root选项指定复数名称,例如“maps”,然后当rails转向并在数组的每个元素上调用to_xml()时,rails将为:root选项指定单数“map”。这是有道理的,因为如果你在一个数组上调用to_xml()并指定:root选项为“maps”,那么自然每个数组元素可能都是&#34; map&#34;。当然,这不是你想要的。

幸运的是,正如mr_sudaca指出的那样:

  

默认情况下,root子节点的名称是   root.singularize。您可以使用<map>进行更改   http://apidock.com/rails/Array/to_xml

结果,这段代码:

:children option

产生输出:

require 'ostruct'

configs = [
  OpenStruct.new(
    key: "PNB_ALERTLOG_RECEIVER_CHANNEL",
    value: "PNB_ALERTLOG_RECEIVER",
    comment: "Canal que...",
  ),
  OpenStruct.new(
    key: "PNB_CFG_FILE_ACCESS_CONTROL",
    value: "resources/configPnbDev/pnbAccessControl.json",
    comment: "Este ficheiro...",
  )
]

entries = []

configs.each do |config|
  entry = {}
  conf = {}

  entry.store('string', config.key)

  conf.store('value', config.value)
  conf.store('comment', config.comment)

  entry.store('com.mirth.connect.util.ConfigurationProperty', conf)

  entries << entry
end

p entries
puts entries.to_xml(:root => 'map', children: "entry", :skip_types => true)

在我看来,你的条目和conf哈希也有一些问题,因为条目数组中的每个元素都会引用相同的条目和conf哈希,并且因为你的循环不断改变那些哈希,数组中的每个条目将引用包含循环中设置的最后一个键/值的哈希。