我有一组数据库对象@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>
答案 0 :(得分:3)
试试这个:
pp entries.to_xml(:root => 'map', :children => 'entry', :indent => 0, :skip_types => true)
答案 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哈希,并且因为你的循环不断改变那些哈希,数组中的每个条目将引用包含循环中设置的最后一个键/值的哈希。