Array to XML - Rails

问题描述:

我有一个多维数组,我想用它来创建一个xml输出。Array to XML - Rails

该数组正在存储csv导入。其中people [0] [...]是将成为xml标签的列名,而people [...> 0] [...]是值。

For instance, array contains: 
people[0][0] => first-name 
people[0][1] => last-name 
people[1][0] => Bob 
people[1][1] => Dylan 
people[2][0] => Sam 
people[2][1] => Shepard 

XML needs to be: 
<person> 
    <first-name>Bob</first-name> 
    <last-name>Dylan</last-name> 
</person> 
<person> 
    <first-name>Sam</first-name> 
    <last-name>Shepard</last-name> 
</person> 

任何帮助表示赞赏。

+2

如果它是一个导入,是否有任何理由你没有导入到散列而不是数组?哈希#to_xml让事情变得更容易,因为你的密钥是正确命名的。 – bensie 2009-11-03 16:31:43

感谢所有发布的人。以下是似乎最适合我需求的解决方案。希望其他人可能会觉得这很有用。

该解决方案抓住远程URL csv文件,并将其存储在一个多维数组,然后导出为XML:

require 'rio' 
require 'fastercsv' 

url = 'http://remote-url.com/file.csv' 
people = FasterCSV.parse(rio(url).read) 

xml = '' 
1.upto(people.size-1) do |row_idx| 
    xml << " <record>\n" 
    people[0].each_with_index do |column, col_idx| 
    xml << " <#{column.parameterize}>#{people[row_idx][col_idx]}</#{column.parameterize}>\n" 
    end 
    xml << " </record>\n" 
end 

有更好的解决方案在那里,用hash.to_xml将是巨大的除了我需要将csv索引行更改为参数化以用作xml标记之外,但此代码适用于我很高兴。

我建议使用FasterCSV导入您的数据并将其转换为散列数组。 to_xml这样,应该给你你想要的东西:

people = [] 
FasterCSV.foreach("yourfile.csv", :headers => true) do |row| 
people << row.to_hash 
end 
people.to_xml 
+0

不错的解决方案,+1 – 2009-11-03 16:35:04

+0

得到这个错误:未定义的方法'to_hash'为# Jeffrey 2009-11-03 17:56:59

+0

Jeffery - 如果您使用Rails环境或脚本/控制台,上述代码将工作。如果你只使用基本的Ruby解释器或irb,它会给你上面的错误。如果仅使用Ruby/irb,则需要包含一些用于xml支持的模块/库。 – Phil 2009-11-03 18:19:39

在那里,我能想到使用XML序列化实现这一目标,一个的两种主要方式是;第二个是推出原始字符串。

这里的第二个示例:

xml = '' 
1.upto(people.size-1) do |row_idx| 
    xml << "<person>\n" 
    people[0].each_with_index do |column, col_idx| 
    xml << " <#{column}>#{people[row_idx][col_idx]}</#{column}>\n" 
    end 
    xml << "</person>\n" 
end 

另一种方式:

hash = {} 
hash['person'] = [] 
1.upto(people.size-1) do |row_idx| 
    row = {} 
    people[0].each_with_index do |column, col_idx| 
    row[column]=people[row_idx][col_idx] 
    end 
    hash['person'] << row 
end 
hash.to_xml 

这里离开这个答案,以防有人需要转换这样一个数组,不是来自一个CSV文件(或者如果他们不能使用FasterCSV)。

+0

FD - 与阵列的第二个伟大工程。有什么方法可以添加人员[0] [x]。参数化到代码? – Jeffrey 2009-11-03 22:34:48

+0

假设我理解正确,将行[column] = ...更改为row [column.parameterize] = ... – 2009-11-05 02:50:53

+0

谢谢,这确实有效。尽管我不再使用散列,因为显示顺序很重要......除非有解决方法吗?该应用程序正在使用rails 2.3.4。 – Jeffrey 2009-11-05 16:17:21

使用Hash.to_xml是一个不错的主意,因为它支持核心轨道。这可能是将Hash类数据导出到简单XML的最简单方法。在大多数简单情况下 - 更复杂的情况下需要更复杂的工具。