拆分大型XML为多个文件

问题描述:

我只是想知道我怎么可以拆分引入nokogiri拆分大型XML为多个文件

例如大XML输出,我充满了Nokogiri::XML数据,现在我想存储在独立的文件所有这些数据,每件不大于10MB。

编辑注释:我们不想在标签的中间划分,我们希望在每个文件中复制xml标题,必须有Nokogiri的方法中的某些东西。

+2

这听起来像一个很好的问题,但你需要在你的要求中更加明确,最好带有样本输入和输出。如果你有'

18MB的文字

'结果应该是什么?如何为'6MB6MB6MB'?怎么样在'4MB4MB 4MB'? – Phrogz

+0

这不是Nokogiri预计会知道该怎么做的事情; Nokogiri生成您告诉它创建的XML。作为开发人员,您应该知道您生成了多少数据,然后在生成XML之前采取措施将这些数据分解为可管理的块。无论您是使用Nokogiri创建XML还是使用适当的生成器生成YAML,JSON或电子邮件,情况都是如此。 –

+0

一个更特别的病理情况:输出应该是什么样的“”等等,直到你有多个兆字节值的属性? – Phrogz

比方说,你有一些XML:

xml = '<foo><child num="1"/><child num="2"/><child num="3"/></foo>' 
doc = Nokogiri::XML(xml) 

而且你要分手的子节点的范围,并分别保存不失层次结构。你可以这样做:

[0..0, 1..1, 2..2].each do |range| 
    c = doc.clone 
    (c.xpath('/foo/child') - c.xpath('/foo/child')[range]).remove #remove nodes not in range 
    File.open("#{range.first}.xml", 'w') {|f| f.write(c.to_s) } 
end 
+0

太棒了!我可以做得更简单吗?例如,nokogiri对象(站点地图)包含了大量的 *我需要在这个对象上做每个**这样的事情,每次运行我们都要计算字节数 – com

如何使用这个简单的代码片段:

def split_by_size(text, size = 10 * 1024 * 1024) 
    text.scan /.{1, #{size}}/ 
end 

split_by_size("12345" * 2, 3) # => ["123", "451", "234", "5"] 

您可以使用此阵块为他们保存为独立的文件。

+0

添加xml头文件好,但不适合XML,我们不希望在标签中间划分,我们要复制xml在每个文件的头文件中,必须有一些nokogiri的方法 – com

+1

这会严重破坏XML文件。 –