如何正确自动化xml到xls

时间:2013-10-18 13:23:15

标签: ruby xml excel converter libxml2

我最近收到了很多xml文件,我想在excel中进行分析。我不想在(较新版本的)excel中使用xml转换标准,而是希望使用Ruby代码自动为大量文件执行此操作。

然而,我对rexml并不是很熟悉。经过半天的工作,我得到了只转换一个(!)xml节点的代码。这是它的外观:

require 'rexml/document'

Dir.glob("FILES/archive/*.xml") do |eksemel|
    puts "converting #{eksemel}"
    filename = (/\d+/.match(eksemel)).to_s 

    xml_file = File.open("#{eksemel}", "r")
    csv_file = File.new("#{filename}.csv", "w")
    xml = REXML::Document.new( xml_file  )

    counter = 0
    xml.elements.each("RESULTS") do |e|
        e.elements.each("component") do |f|
            f.elements.each("paragraph") do |g|
            counter = counter + 1

            csv_file.puts g.text
            end
            end
    end
end

有没有办法a)而不是定义元素的名称和数字让ruby自动执行,b)将所有这些保存为csv文件中的单独列?

1 个答案:

答案 0 :(得分:0)

目前尚不清楚您使用counter的内容。如果您澄清了XML文件具有哪种结构(例如,每个<paragraph>元素中有多个<component>元素?),它也会有所帮助。但是,这是一种更清晰的方式来编写我认为你拍摄的内容:

require 'rexml/document'
require 'csv'

Dir.glob('FILES/archive/*.xml') do |eksemel|
    puts "converting #{eksemel}"

    # I assume you are creating a .csv file with the same name as your .xml file
    xml_file = File.new(eksemel)
    csv_file = CSV.open(eksemel.sub(/\.xml$/, '.csv'), 'w')
    xml = REXML::Document.new(xml_file)

    counter = xml.elements.to_a('RESULTS//component//paragraph').length

    xml.elements.each('RESULTS//component') do |component|
        csv_file << component.elements.to_a('paragraph')
    end

    [xml_file, csv_file].each {|f| f.close}
end