通过xml-simple生成具有相同属性和元素名称的XML

时间:2014-01-06 09:09:32

标签: ruby xml

供应商采用以下格式的XML:

<message type="login", serial="1"> 
  <site>BETA</site>
  <type>DEFAULT</type> 
  <username>john</username> 
  <password>1234</password>
</message>

注意:type用于属性和元素。

当我尝试按xml_simple

生成XML时
data_2 = {'type' => 'login', 'serial' => 1, 
  'site' => ['content' => 'BETA'],
  'type' => ['content' => 'DEFAULT'],
  'username' => ['content' => 'john'],
  'password' => ['content' => '1234'],
}

xml_2 = XmlSimple.xml_out(data_2, {:rootname => 'message'})
puts xml_2

给出:

<message serial="1">
  <type>DEFAULT</type>
  <site>BETA</site>
  <username>john</username>
  <password>1234</password>
</message>

如何在type的属性和元素中保留message

2 个答案:

答案 0 :(得分:1)

问题是你想要一个名为type的属性和子元素,所以你有两个带有这个名字的键。由于散列中的键是唯一的,因此第二个键替换第一个键,因此实际传递给XmlSimple的散列是:

data_2 = {'serial'=&gt; 1,   'site'=&gt; ['content'=&gt; 'BETA'],   'type'=&gt; ['content'=&gt; '默认'],   'username'=&gt; ['content'=&gt; '约翰'],   'password'=&gt; ['content'=&gt; '1234'], }

'type' => 'login'条目替换为'type' => ['content' => 'DEFAULT']

使用XmlSimple的一种方法是使用AttrPrefix选项,并使用@为您的地址名称添加前缀,(请参阅the docs):

data_2 = {'@type' => 'login', '@serial' => 1, 
  'site' => ['content' => 'BETA'],
  'type' => ['content' => 'DEFAULT'],
  'username' => ['content' => 'john'],
  'password' => ['content' => '1234'],
}

xml_2 = XmlSimple.xml_out(data_2, {:rootname => 'message', 'AttrPrefix' => true})
puts xml_2

输出:

<message type="login" serial="1">
  <site>BETA</site>
  <type>DEFAULT</type>
  <username>john</username>
  <password>1234</password>
</message>

答案 1 :(得分:0)

我最终使用builder

require 'builder'

username = 'john'
password = '1234'

xml = Builder::XmlMarkup.new(:indent => 2, :target => $stdout)
xml.message("type" => "login", "serial" => 1) {
  xml.site "BETA"
  xml.type "DEFAULT"
  xml.username username
  xml.password password
}

给出:

<message type="login" serial="1">
  <site>BETA</site>
  <type>DEFAULT</type>
  <username>john</username>
  <password>1234</password>
</message>