我有一个这样的散列:
{
12776=>["Item", "01:Antique", "fabric"],
12777=>["Item", "02:Priceless", "porcelain"],
12740=>["Item", "01:Antique", "silver"]
}
我想生成这样的XML:
<items>
<item type="01:Antique", material="fabric">some other attribute</item>
<item type="02:Priceless", material="porcelain">some other attribute</item>
<item type="01:Antique", material="silver">some other attribute</item>
</items>
请演示一下这是怎么可能的
我绝对推荐使用Nokogiri这样的gem来为您做这件事。像这样的代码应该可以工作:
xml = Nokogiri::XML::Builder.new
xml.items do
hash.values.each do |item_array|
xml.item(type: item_array[1], material: item_array[2]) #some_other_attribute
end
end
显示XML:
1.9.3-p484 :019 > puts xml.to_xml
<?xml version="1.0"?>
<items>
<item type="01:Antique" material="fabric"/>
<item type="02:Priceless" material="porcelain"/>
<item type="01:Antique" material="silver"/>
</items>
看起来差不多:
require 'nokogiri'
hash = {
12776 => ["Item", "01:Antique", "fabric"],
12777 => ["Item", "02:Priceless", "porcelain"],
12740 => ["Item", "01:Antique", "silver"]
}
xml = Nokogiri::XML::Builder.new
xml.items do
hash.each do |key, (_, _type, material)|
xml.item(type: _type, material: material) {
text "some_other_attribute"
}
end
end
puts xml.to_xml
# >> <?xml version="1.0"?>
# >> <items>
# >> <item type="01:Antique" material="fabric">some_other_attribute</item>
# >> <item type="02:Priceless" material="porcelain">some_other_attribute</item>
# >> <item type="01:Antique" material="silver">some_other_attribute</item>
# >> </items>
- 哈希的
each
将键/值对发送到块中。 - 使用
(_, _type, material)
将值的每个元素赋给变量。 -
_
是一个黑洞变量(不是真的,但在这种情况下,这样想就足够了),并吞噬传递给它的值;实际上,它的意思是"忽略它"。 - 我使用
_type
以避免与type
混淆。Ruby会很高兴,但我不会。
一个粗糙的原始实现。如果需要,您可以尝试一些XML库,如Nokogiri来操作XML生成。
hash = {
12776=>["Item", "01:Antique", "fabric"],
12777=>["Item", "02:Priceless", "porcelain"],
12740=>["Item", "01:Antique", "silver"]
}
puts "<items>"
hash.sort_by{|k, _| k}.each do |_, array|
puts %{ <item type="#{array[1]}" material="#{array[2]}">some other attribute</item>}
# or maybe the following?
#puts %{ <item type="#{array[1]}" material="#{array[2]}">#{array[3..-1].join(" ")}</item>}
end
puts "</items>"