使用ruby从CSV生成XML

时间:2015-04-14 07:02:36

标签: ruby xml parsing csv

我有一个CSV文件,我想用ruby解析并从中生成XML。

以下是CSV示例:

id;us;de
1;hello;hallo
2;usa;deutschland
3;big;gross

完成后,XML应如下所示:

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
    <cat id="1">
        <attrs>
            <attr attr-id="word" xml:lang="us">hello</attr>
            <attr attr-id="word" xml:lang="de">hallo</attr>
        </attrs>
    </cat>
    <cat id="2">
        <attrs>
            <attr attr-id="word" xml:lang="us">usa</attr>
            <attr attr-id="word" xml:lang="de">deutschland</attr>
        </attrs>
    </cat>
    <cat id="3">
        <attrs>
            <attr attr-id="word" xml:lang="us">big</attr>
            <attr attr-id="word" xml:lang="de">gross</attr>
        </attrs>
    </cat>
</catalog>

这就是我的ruby文件到目前为止的样子:

require 'csv'

file = File.open("file.csv", "r:UTF-8").read

data = CSV.parse(file, :quote_char => "'", :col_sep => ";")

data.each do |column|  
    id = column[0]
    puts id
end

我得到了每一列,但我无法遍历它以生成XML。你知道如何获得我的最终XML吗?

2 个答案:

答案 0 :(得分:0)

require 'csv'

puts '<?xml version="1.0" encoding="UTF-8"?>'

CSV.foreach("data.csv") do |row|
  puts '<catalog>'
  puts '<cat id=' + "#{row[0]}" + '>'
  puts '<attrs>'
  puts '<attr attr-id="word" xml:lang=' + "#{row[1]}" +'>hello</attr>'
  puts '<attr attr-id="word" xml:lang=' + "#{row[2]}" +'>hello</attr>'
  puts '</attrs>'
  puts '</cat>'
end

puts '</catalog>'

答案 1 :(得分:0)

更一般的情况:

require 'nokogiri'
require 'csv'

builder = Nokogiri::XML::Builder.new do |xml|
  xml.items {
    CSV.foreach 'items.csv', headers: true do |row|
      xml.item {
        row.headers.each do |key|
          xml.send key, row[key]
        end
      }
    end
  }
end

File.open('items.xml', 'w'){|f| f << builder.to_xml}