require 'nokogiri' # = XmlMini Nokogiri implementation module ActiveSupport module XmlMini_Nokogiri #:nodoc: extend self # Parse an XML Document string into a simple hash using libxml / nokogiri. # string:: # XML Document string to parse def parse(string) if string.blank? {} else doc = Nokogiri::XML(string) { |cfg| cfg.noblanks } raise doc.errors.first if doc.errors.length > 0 doc.to_hash end end module Conversions module Document def to_hash root.to_hash end end module Node 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