1
0
Fork 0
mirror of https://github.com/rails/rails.git synced 2022-11-09 12:12:34 -05:00
rails--rails/activesupport/lib/active_support/xml_mini/nokogiri.rb
Aaron Patterson 694998ee4f Nokogiri backend for XmlMini
[#2190 state:committed]

Signed-off-by: Jeremy Kemper <jeremy@bitsweat.net>
2009-03-10 11:56:19 -07:00

67 lines
1.7 KiB
Ruby

# = XML Mini 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)
return {} if string.blank?
doc = Nokogiri::XML(string).to_hash
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 = {})
hash[name] ||= attributes_as_hash
walker = lambda { |child, memo, callback|
next if child.blank?
if child.text?
(memo[CONTENT_ROOT] ||= '') << child.content
next
end
name = child.name
if memo[name]
memo[name] = [memo[name]].flatten
memo[name] << child.attributes_as_hash
else
memo[name] = child.attributes_as_hash
end
# Recusively walk children
child.children.each { |c| callback.call(c, memo[name], callback) }
}
children.each { |c| walker.call(c, hash[name], walker) }
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