class Hash

Public Class Methods

from_xml(xml_io) click to toggle source
# File lib/ext/hash.rb, line 5
def from_xml(xml_io)
  result = Nokogiri::XML(xml_io)
  { result.root.name => xml_node_to_hash(result.root)}
end
xml_node_to_hash(node) click to toggle source
# File lib/ext/hash.rb, line 10
def xml_node_to_hash(node)
  if node.element?
    result_hash = {}
    if node.attributes != {}
      attributes = {}
      node.attributes.keys.each do |key|
        if [:id, 'id', :name, 'name'].include?(key)
          node.name = node.attributes[key].value
          node.delete(key.to_s)
        else
          attributes[node.attributes[key].name] = node.attributes[key].value
        end
      end
    end

    if node.children.size > 0
      node.children.each do |child|
        result = xml_node_to_hash(child)

        if child.name == 'text'
          unless child.next_sibling || child.previous_sibling
            return result unless attributes
            result_hash[child.name] = result
          end
        elsif result_hash[child.name]
          if result_hash[child.name].is_a?(Array)
             result_hash[child.name] << result
          else
             result_hash[child.name] = [result_hash[child.name]] << result
          end
        else
          result_hash[child.name] = result
        end
      end
      if attributes
        result_hash = attributes.merge(result_hash)
      end
      return result_hash
    else
      return attributes
    end
  else
    node.content.to_s
  end
end