如何覆盖从散列生成XML



我有一个这样的散列:

{
  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>"

相关内容

  • 没有找到相关文章