Работает она просто, весь xml файл, вместе с аттрибутами и вложенными тегами, конвертирует в хэш.
module XmlParser
def parse(xml_text, prefix)
items = []
doc = REXML::Document.new(xml_text)
REXML::XPath.each(doc, prefix) do |xml|
item = {}
xml.attributes.each do |k, value|
item.store(k.to_sym, value)
end
translate_children(xml, item)
items << item
end
return items
end
private
def translate_children(xml, item)
return if xml.children.empty?
xml.each_child do |child|
if child.kind_of? REXML::Element
sub_item = {}
if item.include?(child.name.to_sym)
if item[child.name.to_sym].is_a? Array
item.store(child.name.to_sym,
item[child.name.to_sym] << sub_item)
else
item.store(child.name.to_sym,
[item[child.name.to_sym], sub_item])
end
else
item.store(child.name.to_sym, sub_item)
end
if child.has_text?
sub_item[:text] = child.text.strip
end
child.attributes.each do |k, value|
sub_item.store(k.to_sym, value)
end
translate_children(child, sub_item)
end
end
end
end
Пример использования
include XmlParser
parse(xml_text, '/projects')