gpt4 book ai didi

ruby - 结合 Nokogiri XML 构建器

转载 作者:数据小太阳 更新时间:2023-10-29 01:43:00 25 4
gpt4 key购买 nike

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

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

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

最佳答案

委派构建器功能

for instance, a parent builder calling functions that set child builders to create smaller portions of the document

您可以轻松地将责任委托(delegate)给获取构建器当前状态并使用它的方法。例如:

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(或您称之为构建器对象的任何内容)传递给该方法,然后让该方法执行它需要的操作(通过程序或手动)。

创建后修改构建器

Or is there a way to modify a builder after its block terminates?

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

关于ruby - 结合 Nokogiri XML 构建器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11635572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com