Quiz 第三题的解法

1 view
Skip to first unread message

volve...@gmail.com

unread,
Oct 31, 2006, 7:43:22 AM10/31/06
to 闲敲棋子落灯花
# Quiz: Gedcom Parser
# Auther: volvet


require "rexml/document"

unless ARGV.size == 1 and test(?e,ARGV[0])
puts "Usage: #{File.basename(__FILE__)} GEDCOM File"
exit
end

lineArray = File.open(ARGV[0]) { |f| f.read }.split(/\n/)

doc = REXML::Document.new("<gedcom/>");

stack = [doc.root]

lineArray.each do |line|
next if line =~ /^\s*$/
line =~ /^\s*(\d+)\s+(@\S+@|\S+)(\s+.*)?$/ or next
level = $1.to_i
tag = $2
data = $3
while (level+1)<stack.size
stack.pop
end
parent = stack.last
if tag =~ /@\S+@/
el = parent.add_element data
el.attributes['id'] = tag
else
el = parent.add_element tag
el.text = tag
end
stack.push el
end


doc.write($stdout,0)
doc.write(File.open(ARGV[0]+'.xml','wb'),0)

Reply all
Reply to author
Forward
0 new messages