如何使用XmlSimple生成具有属性和文本节点的XML元素?

时间:2012-04-03 15:49:50

标签: ruby xml xml-simple

我有一个听起来很基本的问题,但我没有在任何地方找到解决方案。 我正在使用Ruby版本的XmlSimple,特别是xml_out函数。

问题

我输出的元素有一个属性节点和一个文本节点。 这就是我想要的:

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

这是我目前得到的:

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

我试过使用“ContentKey”=&gt; xml_out的'content'选项(除了“AttrPrefix”=&gt; true),但产生了相同的结果。我也试图改变ContentKey,同样的区别。

相关代码

属性&amp;文本节点被添加到数组中:

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
  • Ruby:1.9.3-p125
  • XmlSimple:1.0.13

到处看,似乎没有人遇到过这个问题。也许我错过了什么,或者可能不会/不应该这样做?

我非常感谢任何帮助。

2 个答案:

答案 0 :(得分:3)

关于XmlSimple的好处在于它是可循环播放的:也就是说,您可以通过xml_in放置所需的输出,它将为您提供使用xml_out生成它所需的内容。 / p>

我们来看看。假设我们有以下简化的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>

由于以上对我有用,我唯一能想到的是你的哈希值不能包含你认为它包含的内容。

答案 1 :(得分: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简单代码。