10

構成は気に入ってNokogiri::XML::Builderいますが、ジョブを複数のビルダーに分割してビルドプロセスをさらにモジュール化できれば、大きなXMLドキュメントを組み立てるのが簡単になります。

複数のビルダーを協力させる方法を誰かが見ていますか?(たとえば、ドキュメントのより小さな部分を作成するように子ビルダーを設定する関数を呼び出す親ビルダー)

または、ブロックが終了した後にビルダーを変更する方法はありますか?(--- XMLを出力し、それをNokogiri :: XML :: Documentに解析し、ノードを追加してから、XMLを再度出力することはできません)

4

1 に答える 1

16

Builder機能の委任

たとえば、親ビルダーは、子ビルダーがドキュメントのより小さな部分を作成するように設定する関数を呼び出します

ビルダーの現在の状態を取得して使用するメソッドに責任を簡単に委任できます。例えば:

require 'nokogiri'

def add_kids_for(name,xml)
  xml.send(name){ 1.upto(3){ |i| xml.kid("#{name}'s kid ##{i}") } }
end

build = Nokogiri::XML::Builder.new do |xml|
  xml.root do
    add_kids_for("Danny",xml)
    add_kids_for("Billy",xml)
  end
end
puts build.to_xml
#=> <?xml version="1.0"?>
#=> <root>
#=>   <Danny>
#=>     <kid>Danny's kid #1</kid>
#=>     <kid>Danny's kid #2</kid>
#=>     <kid>Danny's kid #3</kid>
#=>   </Danny>
#=>   <Billy>
#=>     <kid>Billy's kid #1</kid>
#=>     <kid>Billy's kid #2</kid>
#=>     <kid>Billy's kid #3</kid>
#=>   </Billy>
#=> </root>

xml(またはビルダーオブジェクトと呼ぶものは何でも)メソッドに渡し、そのメソッドに必要なことを(手続き的または手動で)実行させます。

作成後のビルダーの変更

または、ブロックが終了した後にビルダーを変更する方法はありますか?

はい!:)あなたはそれを運転するdocためにビルダーのメソッドにしたいと思います。Nokogiri::XML::Document上記の例を実行します。

doc = build.doc
doc.css('kid').each do |kid|
  kid['name'] = %w[Bobby Jenny Jill Sam Gish Gavin Lisa Imogen Lachlan].sample
end
puts doc
#=> <root>
#=>   <Danny>
#=>     <kid name="Lisa">Danny's kid #1</kid>
#=>     <kid name="Imogen">Danny's kid #2</kid>
#=>     <kid name="Lachlan">Danny's kid #3</kid>
#=>   </Danny>
#=>   <Billy>
#=>     <kid name="Gish">Billy's kid #1</kid>
#=>     <kid name="Gavin">Billy's kid #2</kid>
#=>     <kid name="Sam">Billy's kid #3</kid>
#=>   </Billy>
#=> </root>
于 2012-07-24T22:30:18.837 に答える