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

Ruby 如何使用XmlSimple生成具有属性和文本节点的XML元素?,ruby,xml,xml-simple,Ruby,Xml,Xml Simple,我有一个听起来很基本的问题,但我还没有找到解决办法。 我使用的是XmlSimple的Ruby版本,特别是xml_out函数 问题 我在输出一个元素时遇到问题,该元素有一个属性节点和一个文本节点。 以下是我想要的: <lane id='1'>unchannelized</lane> 环境详细信息 操作系统:Windows7 Ruby:1.9.3-p125 XmlSimple:1.0.13 到处看看,似乎没有人有这个问题。也许我遗漏了什么,或者这不能/不应该做 我非常感

我有一个听起来很基本的问题,但我还没有找到解决办法。 我使用的是XmlSimple的Ruby版本,特别是xml_out函数

问题

我在输出一个元素时遇到问题,该元素有一个属性节点和一个文本节点。 以下是我想要的:

<lane id='1'>unchannelized</lane>
环境详细信息

  • 操作系统:Windows7
  • Ruby:1.9.3-p125
  • XmlSimple:1.0.13
到处看看,似乎没有人有这个问题。也许我遗漏了什么,或者这不能/不应该做


我非常感谢您在这方面的帮助。

XmlSimple的优点在于它是可折叠的:也就是说,您可以通过
xml\u输入
输入所需的输出,它将为您提供使用
xml\u输出
生成所需的内容

请让我们看一看。假设我们有以下简化的XML:

require 'xmlsimple'

xml = %Q(
  <CORSIMNetwork>
    <lane id='1'>unchannelized</lane>
  </CORSIMNetwork>
)
根已不存在,因为我们尚未指定
KeepRoot
选项,但除此之外,它是我们所期望的

现在,让我们在其上执行一个
xml\u out
,指定
RootName
选项以获取根:

<CORSIMNetwork>
  <lane id="1">unchannelized</lane>
</CORSIMNetwork>
输出:

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

未退火

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

以下是一些可以帮助您的示例

=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'})
=开始
博尔特,乌塞恩
=结束
数据={'id'=>1,'content'=>bolt,usain'}
p XmlSimple.xml_out(数据,{:rootname=>'lane'})
开始
博尔特,乌塞恩
=结束
数据={'id'=>1,'runner'=>[{'num'=>1,'content'=>'bolt,usain'}]}
p XmlSimple.xml_out(数据,{:rootname=>'lane'})
开始
博尔特,乌塞恩
牙买加
=结束
数据={'id'=>1,
'runner'=>[{'num'=>1,'内容'=>'博尔特,usain'}],
'国家'=>[{'code'=>165,'内容'=>'牙买加'}]
}
p XmlSimple.xml_out(数据,{:rootname=>'lane'})
开始
螺栓
usain 1,
'runner'=>[{'num'=>1',姓氏'=>[“bolt”],'name'=>[“usain”]}],
'国家'=>[{'code'=>165,'内容'=>'牙买加'}]
}
p XmlSimple.xml_out(数据,{:rootname=>'lane'})

首先显示要获取的xml,作为块注释,然后是生成该xml所需的xml简单代码。

为什么要将输出传递给REXML?这一点很好,因为在XmlSimple引用中,他们在将REXML文档写入文件之前向其添加了一个空格。我真的不在乎,所以我可以绕过它。这与问题无关。如果我不这样做,我会得到相同的结果。您上面的代码(精确)为我返回:unchannelized square,您的
ContentKey
似乎没有使用
attrprix
进行处理。但是您不需要使用带有
id
的AttrPrefix,正如我在上面展示的和您已经发现的那样。也许有一个bug修复版本?尝试升级。宾果。非常感谢你。显然这是一只虫子。1.1.1工作正常。
require 'xmlsimple'

xml = %Q(
  <CORSIMNetwork>
    <lane id='1'>unchannelized</lane>
  </CORSIMNetwork>
)
{"lane"=>[{"id"=>"1", "content"=>"unchannelized"}]}
<CORSIMNetwork>
  <lane id="1">unchannelized</lane>
</CORSIMNetwork>
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>
=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'})