Ruby - Builder - 尝试将CS​​V行转换为用于构造多个XML的数据集

时间:2012-02-24 06:32:29

标签: ruby xml soap nokogiri builder

这就是我想要完成的事情。我需要一个包含标题和多行的CSV。我正在遍历标题并存储然后将行数据与标题相关联。我需要能够遍历CSV中的每一行以用于构造XML的数据。然后将构造的XML转储为.xml文件,程序在CSV的下一行开始。每行都有一列提供XML文件的名称。

这是我到目前为止所得到的。

从CSV文件中读取数据。收集标题和行数据。

def get_rows
        raw_data = CSV.read('test.csv', {:skip_blanks => false, :headers => true})
        data = []
        raw_data.each { |row| data << row}
        return build_header(data, raw_data)
    end

获取标题和行数据并将它们结合起来。

def build_header(data, raw_data)
    (0..(data.length - 1)).each do |ri|
        h = {}
        raw_data.headers.each_with_index do |v, i|
            h[v] = data[ri].fields[i]
        end
        return build_ostruct(h)
    end
end

取哈希值h并制作它的结构。

def build_ostruct(h)
    x = OpenStruct.new(h)
    uniq = x.tc_name
    y = uniq_name.to_s + ".xml"
    #marshal dump for debugging
    x.marshal_dump.each{ |k,v| puts "#{k} => #{v}" }
    return xml_builder(x, y)

end

在此之下,我将使用新的ostruct“x”并从CSV调用列标题以#populate XML节点

例如:x.column1,x.column2,x.column3

现在,我正忙着处理的部分是让ostruct在每次迭代运行时接收新的数据行。目标是让ostruct填充CSV中的每一行。目前,哈希显示正确的数据集,我的XML按预期填充,但仅限于第一行数据。我如何让它遍历所有行并使用每次迭代的数据填充ostruct,这样我就可以创建一个批量的XML集?

提前感谢您提供的任何帮助!

2 个答案:

答案 0 :(得分:3)

这样的事情应该有效:

require 'csv'
require 'nokogiri'

CSV.foreach('test.csv', :headers => true) do |row|
    builder = Nokogiri::XML::Builder.new do |xml|
        xml.root do |root|
            row.each do |k, v|
                root.send k, v
            end
        end
    end
    File.open("#{row['tc_name']}.xml", 'w'){|f| f << builder.to_xml}
end

答案 1 :(得分:1)

您在return中呼叫build_header,结束通话。您需要以某种方式收集结果而不立即返回第一个结果,以便build_header可以针对整个行集运行。