Techioz Blog

ビルダー XML 動的要素

概要

プログラムを実行し、ビルダーメソッドを使用して要素を動的に割り当てようとしています。手順をステップ実行しながら、変数を使用して要素を動的に割り当てようとしています。この変数を要素に渡すためにいくつかのオプションを試みましたが、機能しません。

私はもともとハッシュでデータを構築することから始めましたが、完全な手順では重複キーがあるため、より直接的なものに移行する必要がありました。

ビルダーを使用して希望の効果を達成することは可能ですか

require 'builder'
x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)
x.instruct!
x.character do
  stats = "health, mana, armor"
  stats.split(",").each do |stat|
    key = stat.strip.downcase
    value = rand()
    x.key value
  end #end do
end #end do

出力

C:\Projects>ruby test.rb
<?xml version="1.0" encoding="UTF-8"?>
<character>
 <key>0.1405191069855357</key>
 <key>0.3484226234753265</key>
 <key>0.4658284443108096</key>
</character>

望ましい出力

C:\Projects>ruby test.rb
<?xml version="1.0" encoding="UTF-8"?>
<character>
 <health>0.1405191069855357</health>
 <mana>0.3484226234753265</mana>
 <armor>0.4658284443108096</armor>
</character>

解決策

require 'builder'
x = Builder::XmlMarkup.new(:target => $stdout, :indent => 1)
x.instruct!
x.character do
  stats = "health, mana, armor"
  stats.split(",").each do |stat|
    key = stat.strip.downcase
    value = rand()
    x.__send__(key, value)
  end
end

Ruby オブジェクトのメソッド send またはそのエイリアス send を使用できます。 ただし、send word はそのキーとしても使用できるため、オブジェクトで使用できるように公開されるのは send だけです。 言及されたメソッドのドキュメント: https://translate.google.com/translate?hl=ja&sl=en&tl=ja&u=https://ruby-doc.org/core-2.6.5/Object.html#method-i-send

これは強力な方法であり、簡単に機能を壊してしまう可能性があるため、必ず使用範囲を制限するようにしてください。