Вот их документация.
И небольшой пример:
xml = File.read(self.filename)
remove_unused_nodes(xml)
doc = XML::Document.string(xml)
# doc = XML::Document.file(self.filename) # Можно и так создавать документ
doc.find('//VisioDocument/Masters/Master').each do |s|
master = {}
master.store(:base_id, s['BaseID'])
master.store(:master_id, s['ID'])
self.masters << master
end
В целом документ размером в 5-10мб парсит меньше чем пол секунды, для моей задачи более чем приемлемо. На этом я думаю мои искания парсеров закончены :)