结合Nokogiri XML Builders

Jel*_*Cat 9 ruby xml nokogiri

我喜欢这个Nokogiri::XML::Builder构造,但如果我可以通过在几个构建器之间拆分作业来进一步模块化构建过程,那么组装大型XML文档会更容易.

有没有人看到让多个建筑商合作的方法?(例如,父构建器调用函数来设置子构建器以创建文档的较小部分)

或者有没有办法在块终止后修改它?(---没有输出XML,然后将其解析为Nokogiri :: XML :: Document,然后添加节点,然后再次输出XML)

Phr*_*ogz 15

委派构建器功能

例如,父构建器调用函数来设置子构建器以创建文档的较小部分

您可以轻松地将责任委派给采用构建器当前状态并使用它的方法.例如:

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>
Run Code Online (Sandbox Code Playgroud)

只需将xml(或者您调用构建器对象的任何内容)传递给方法,然后让该方法执行它所需的操作(程序或手动).

创建后修改构建器

或者有没有办法在块终止后修改它?

是! :)你想要docBuilder 的方法来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>
Run Code Online (Sandbox Code Playgroud)