2012-04-03 44 views
2

我有一個聽起來很基本的問題,但我還沒有找到任何解決方案。 我使用Ruby版本的XmlSimple,特別是xml_out函數。如何使用XmlSimple生成帶有屬性和文本節點的XML元素?

的問題

我無法輸出這將具有一個屬性節點和文本節點的元素。 這裏就是我想:

<lane id='1'>unchannelized</lane> 

這是我目前得到:

<lane id='1'> 
    <content>unchannelized</content> 
</lane> 

我試圖用「ContentKey」 =>「內容」選項xml_out(除了「 AttrPrefix「=> true),但得到了相同的結果。我試着改變ContentKey,同樣的區別。

相關代碼

屬性&文本節點被添加到該數組:

laneConfigArr << {"@id" => laneNo, "content" => netsimLaneChannelizationCode(matchArr[matchIndex])} 

正在生成的實際的哈希:

unhappyHash << { 
    #more stuff here, 
    "LaneConfig" => {"lane" => laneConfigArr}, 
    #more stuff here 
} 

的xml_out通話[EDITED]:

result["NetsimLinks"] = {"NetsimLink" => unhappyHash} 
doc = XmlSimple.xml_out(result, {"AttrPrefix" => true, "RootName" => "CORSIMNetwork", "ContentKey" => "content"}) 

環境細節

  • 操作系統:Windows 7
  • 紅寶石:1.9.3-P125
  • XmlSimple:1.0.13

到處找,沒人似乎有這個問題。也許我錯過了一些東西,或者不能/不應該這樣做?

我非常感謝任何幫助。

+0

你爲什麼要將輸出傳遞給REXML? – 2012-04-03 16:29:23

+0

好處,因爲在XmlSimple引用中,它們在將REXML文檔寫入文件之前會爲其添加一個空格。我真的不在乎,所以我可以繞過它。這與問題無關。如果我不這樣做,我會得到相同的結果。 – 2012-04-03 16:35:30

回答

3

約XmlSimple的好處是,它是圓trippable:也就是說,你可以把你想要的輸出通過xml_in,它會給你你需要什麼xml_out生產它。

讓我們來看看。假設我們有以下簡化XML:

require 'xmlsimple' 

xml = %Q(
    <CORSIMNetwork> 
    <lane id='1'>unchannelized</lane> 
    </CORSIMNetwork> 
) 

現在讓我們看看我們得到儘可能的XmlSimple.xml_in(xml)結果:

{"lane"=>[{"id"=>"1", "content"=>"unchannelized"}]} 

根走了,因爲我們沒有指定KeepRoot選項,但否則這是我們所期望的。

現在讓我們做它的xml_out指定RootName選項以獲得根回:

<CORSIMNetwork> 
    <lane id="1">unchannelized</lane> 
</CORSIMNetwork> 

看起來OK。我檢查了AttrPrefix選項,除了要求輸入"@id"而不是"id"鍵以外,輸出仍然是一樣的。

產生正確的輸出

完整的腳本:

require 'xmlsimple' 

lane_config = [{ "@id" => 1, "content" => "unchannelized"}] 
unhappy = { 
    "LaneConfig" => {"lane" => lane_config}, 
} 

doc = XmlSimple.xml_out(unhappy, {"AttrPrefix" => true, 
            "RootName" => "CORSIMNetwork", 
            "ContentKey" => "content" 
       }) 
puts doc 

輸出:

<CORSIMNetwork> 
    <LaneConfig> 
    <lane id="1">unchannelized</lane> 
    </LaneConfig> 
</CORSIMNetwork> 

由於上述作品對我來說,我能想到的唯一的事情就是你的哈希值不得包含你認爲它包含。

+0

你上面(精確),我的代碼返回: 非通道 2012-04-03 19:50:12

+0

奇怪了,你的'ContentKey'似乎並沒有與處理'AttrPrefix' 。但是你不需要帶'id'的AttrPrefix,正如我在上面顯示的那樣,你已經發現了。 – 2012-04-03 20:00:10

+0

我的XmlSimple是1.1.1。也許有一個錯誤修復版本?嘗試升級。 – 2012-04-03 20:01:03

2

這些都是一些例子,可以幫助你

=begin 
    <lane id="1"> 
     bolt,usain 
    </lane> 
=end 

data = {'id' => 1,'content' => 'bolt,usain'} 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      bolt, usain 
     </runner> 
    </lane> 
=end 

data = {'id' => 1, 'runner' => [{'num' => 1, 'content' => 'bolt,usain'}]} 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      bolt,usain 
     </runner> 
     <country code="165"> 
      jamaica 
     </country> 
    </lane> 
=end 

data = {'id' => 1, 
     'runner' => [{'num' => 1, 'content' => 'bolt, usain'}], 
     'country' => [{'code' => 165, 'content' => 'jamaica'}] 
     } 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

=begin 
    <lane id="1"> 
     <runner num="1"> 
      <surname>bolt</surname> 
      <name>usain</name) 
     </runner> 
     <country code="165"> 
      jamaica 
     </country> 
    </lane> 
=end 

data = {'id' => 1, 
     'runner' => [{'num' => 1, 'surname' => ["bolt"], 'name' => ["usain"]}], 
     'country' => [{'code' => 165, 'content' => 'jamaica'}] 
     } 
p XmlSimple.xml_out(data,{:rootname => 'lane'}) 

首先出現在XML爲獲得作爲一個塊註釋,後來來生成XML需要XML的簡單的代碼。

相關問題