供应商采用以下格式的XML:
<message type="login", serial="1">
<site>BETA</site>
<type>DEFAULT</type>
<username>john</username>
<password>1234</password>
</message>
注意:type
用于属性和元素。
当我尝试按xml_simple
:
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
:
答案 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>