2

基本的に聞こえる問題がありますが、どこにも解決策が見つかりません。XmlSimple の Ruby バージョン、具体的には xml_out 関数を使用しています。

問題

1 つの属性ノードと 1 つのテキスト ノードを持つ要素を出力できません。ここに私が欲しいものがあります:

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

これが私が現在得ているものです:

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

"ContentKey" => 'content' オプションを xml_out に (「AttrPrefix」 => true に加えて) 使用しようとしましたが、同じ結果が得られました。ContentKey も変更しようとしましたが、同じ違いです。

関連コード

配列に追加される属性とテキスト ノード:

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

生成される実際のハッシュ:

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

xml_out 呼び出し [編集済み]:

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

環境の詳細

  • OS: Windows7
  • ルビー: 1.9.3-p125
  • XmlSimple: 1.0.13

どこを見ても、誰もこの問題を抱えていないようです。おそらく私は何かを見逃しているのでしょうか、それともこれを行うことができない/すべきではないのでしょうか?

これについて何か助けていただければ幸いです。

4

2 に答える 2

3

XmlSimple の優れた点は、ラウンド トリップ可能であることです。つまり、必要な出力を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>

問題ないようです。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>

上記は私にとってはうまくいくので、私が考えることができる唯一のことは、ハッシュに含まれていると思われるものを含めてはならないということです。

于 2012-04-03T17:51:31.303 に答える
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-simple コードが続きます。

于 2012-04-03T18:05:44.563 に答える