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
|