require 'nokogiri' # = XmlMini Nokogiri implementation module ActiveSupport module XmlMini_Nokogiri #:nodoc: extend self # Parse an XML Document string or IO into a simple hash using libxml / nokogiri. # data:: # XML Document string or IO to parse def parse(data) if !data.respond_to?(:read) data = StringIO.new(data || '') end char = data.getc if char.nil? {} else data.ungetc(char) doc = Nokogiri::XML(data) { |cfg| cfg.noblanks } raise doc.errors.first if doc.errors.length > 0 doc.to_hash end end module Conversions #:nodoc: module Document #:nodoc: def to_hash root.to_hash end end module Node #:nodoc: CONTENT_ROOT = '__content__' # Convert XML document to hash # # hash:: # Hash to merge the converted element into. def to_hash(hash = {}) attributes = attributes_as_hash if hash[name] hash[name] = [hash[name]].flatten hash[name] << attributes else hash[name] ||= attributes end children.each { |child| next if child.blank? && 'file' != self['type'] if child.text? || child.cdata? (attributes[CONTENT_ROOT] ||= '') << child.content next end child.to_hash attributes } hash end def attributes_as_hash Hash[*(attribute_nodes.map { |node| [node.node_name, node.value] }.flatten)] end end end Nokogiri::XML::Document.send(:include, Conversions::Document) Nokogiri::XML::Node.send(:include, Conversions::Node) end end