2016-11-30 81 views
0

我有一個數據庫對象數組,@configs,我想轉換爲XML格式但輸出不是預期的。每個條目都包含在<map>標記中,而不是<entry>標記,我只希望<tag>成爲XML根。如何使用<tag>根構建XML,並將所有條目放在<entry>標記中? 非常感謝您的幫助和時間!如何在Rails中將哈希數組轉換爲XML?

這裏是我的代碼:

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> 

回答

1

設項如下哈希:

entry = { 
    a: 「hello」, 
    b: 「goodbye」, 
} 

如果你寫:

entries = [] 
entries << entry 
p entries 

那麼輸出是:

[{:a => 「hello」, {:b => 「goodbye」}] 

所以,如果你再寫:

p entries.to_xml 

你認爲單詞「entry」會出現在輸出中嗎?這就像是期望輸出:

x = 10 
y = 20 
puts x+y 

在某處包括字母「x」和「y」。

按照to_xml()文檔用於數組:

返回字符串...由每個元素調用to_xml。
選項散列向下傳遞。
http://apidock.com/rails/Array/to_xml

的選項哈希向下傳遞這一事實意味着,當您爲to_xml指定{root: map}()陣列上打電話,然後<map>將成爲XML的根,當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> 

嵌套<map>標籤是內置於to_xml()方法的特徵的副作用:如果用於指定多個名稱:陣列上調用to_xml()時根選項,例如「maps」,然後當rails轉向並在數組的每個元素上調用to_xml()時,rails將爲:root選項指定單數「映射」。這是有道理的,因爲如果你在數組上調用to_xml(),並且指定:root選項爲「maps」,那麼每個數組元素自然可能會是一個「map」。當然,那不是你想要的。

幸運的是,作爲mr_sudaca指出的,是這樣的:

通過對根的子節點的默認名稱是 root.singularize。您可以使用:children option進行更改。
http://apidock.com/rails/Array/to_xml

其結果是,此代碼:

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) 

產生輸出:

<?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...</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...</comment> 
    </com.mirth.connect.util.ConfigurationProperty> 
    </entry> 
</map> 

它看起來像你對我也有一些問題,你的進入和CONF哈希因爲entries數組中的每個元素都會引用相同的條目和conf哈希,並且由於您的循環不斷更改這些哈希,數組中的每個條目都會引用哈希值at包含循環中設置的最後一個鍵/值。

+0

非常感謝您的啓發和詳細的解釋@ 7stud,它真的幫助我瞭解to_xml()。謝謝你的時間! – Ayanami

相關問題