结合Nokogiri XML Builders

时间:2012-07-24 16:47:01

标签: ruby xml nokogiri

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

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

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

1 个答案:

答案 0 :(得分:14)

委派构建器功能

  

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

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

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(或任何您调用的构建器对象)传递给方法,然后让该方法执行所需操作(程序或手动)。

创建后修改构建器

  

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

是的! :)您希望使用Builder的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>