0

我最近收到了很多 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文件中?

4

1 回答 1

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
于 2013-11-13T12:34:08.097 回答