2

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

问题

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

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

这是我目前得到的:

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

我尝试对 xml_out 使用 "ContentKey" => 'content' 选项(除了 "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"})

环境细节

  • 操作系统:Windows 7
  • 红宝石: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"key 之外,输出仍然相同。

产生正确输出的完整脚本:

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 回答