将 XML 转换为散列并不是一个好的解决方案。剩下的哈希值比原始 XML 更难解析。另外,如果 XML 太大,您将得到一个不适合内存且无法处理的散列,而原始 XML 可以使用 SAX 解析器进行解析。
假设文件在加载时不会压倒您的内存,我建议使用Nokogiri来解析它,执行以下操作:
require 'nokogiri'
class Album
attr_reader :song_name, :song_type
def initialize(song_name, song_type)
@song_name = song_name
@song_type = song_type
end
end
xml = <<EOT
<xml>
<album>
<song-name type="published">Do Re Mi</song-name>
</album>
<album>
<song-name type="unpublished">Blah blah blah</song-name>
</album>
</xml>
EOT
albums = []
doc = Nokogiri::XML(xml)
doc.search('album').each do |album|
song_name = album.at('song-name')
albums << Album.new(
song_name.text,
song_name['type']
)
end
puts albums.first.song_name
puts albums.last.song_type
哪个输出:
Do Re Mi
unpublished
代码首先定义一个合适的对象来保存你想要的数据。当 XML 被解析为 DOM 时,代码将遍历所有<album>
节点,提取信息,定义类的实例,并将其附加到albums
数组中。
运行后,您将拥有一个数组,您可以步行并处理每个项目,将其存储到数据库中,或者根据需要进行操作。但是,如果您的目标是将这些信息插入数据库,那么让 DBM 读取 XML 并直接导入它会更聪明。