metasploit-framework/lib/active_support/xml_mini/nokogiri.rb

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