gpt4 book ai didi

ruby /生成器 API : create XML without using blocks

转载 作者:太空宇宙 更新时间:2023-11-03 16:07:11 24 4
gpt4 key购买 nike

我想使用 Builder基于 ActiveRecord 模型表构造一组 XML 文件。我有将近一百万行,所以我需要使用 find_each(batch_size: 5000) 遍历记录并为每批记录编写一个 XML 文件,直到记录耗尽。类似于以下内容:

filecount = 1
count = 0
xml = ""
Person.find_each(batch_size: 5000) do |person|
xml += person.to_xml # pretend .to_xml() exists
count += 1

if count == MAX_PER_FILE
File.open("#{filecount}.xml", 'w') {|f| f.write(xml) }
xml = ""
filecount += 1
count = 0
end
end

这不适用于 Builder 的界面,因为它希望以 block 的形式工作,如下所示:

xml = builder.person { |p| p.name("Jim") }

一旦 block 结束,Builder 将关闭其当前节;您不能保留对 p 的引用并在 block 外使用它(我试过)。基本上,Builder 想要“拥有”迭代。

所以为了使它与构建器一起工作,我必须做类似的事情:

  filecount = 0
offset = 0
while offset < Person.count do
count = 0
builder = Builder::XmlMarkup.new(indent: 5)
xml = builder.people do |people|
Person.limit(MAX_PER_FILE).offset(offset).each do |person|
people.person { |p| p.name(person.name) }
count += 1
end
end

File.open("#output@file_count.xml", 'w') {|f| f.write(xml) }
filecount += 1
offset += count
end

有没有一种不用 block 语法就可以使用 Builder 的方法?有没有办法以编程方式告诉它“关闭当前节”而不是依赖一个 block ?

最佳答案

我的建议:不要使用生成器。

只要您正确转义 xml 实体,XML 就是一种简单的格式。

对您的数据库检索进行批处理,然后将批处理作为 xml 写入文件句柄。不要像您的示例所示那样通过字符串进行缓冲。只需写入文件句柄。让操作系统处理缓冲。文件可以是任何大小,为什么要限制?

此外,不要包括缩进空格,它们加起来有数百万行。

已添加在编写xml文件时,我还在文件的顶部包含了xml注释:

  • 生成xml文件的软件名称和版本
  • 写入文件的日期/时间戳
  • 其他有用的信息。例如,在这种情况下,您可以说该文件是原始数据集的批处理 #x。

关于 ruby /生成器 API : create XML without using blocks,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11193565/

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