Upgrade to Rails 2.3.5. Also work around this bug: https://rails.lighthouseapp.com/projects/8994/tickets/3524 created by the aforementioned Rails release.
70 lines
1.6 KiB
Ruby
70 lines
1.6 KiB
Ruby
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
|