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>
任何帮助表示赞赏。
答
感谢所有发布的人。以下是似乎最适合我需求的解决方案。希望其他人可能会觉得这很有用。
该解决方案抓住远程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
答
在那里,我能想到使用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)。
答
使用Hash.to_xml
是一个不错的主意,因为它支持核心轨道。这可能是将Hash类数据导出到简单XML的最简单方法。在大多数简单情况下 - 更复杂的情况下需要更复杂的工具。
如果它是一个导入,是否有任何理由你没有导入到散列而不是数组?哈希#to_xml让事情变得更容易,因为你的密钥是正确命名的。 – bensie 2009-11-03 16:31:43