Method: LibXML::Conversions::Node#to_hash

Defined in:
lib/active_support/xml_mini/libxml.rb

#to_hash(hash = {}) ⇒ Object

Convert XML document to hash.

hash

Hash to merge the converted element into.



43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
# File 'lib/active_support/xml_mini/libxml.rb', line 43

def to_hash(hash = {})
  node_hash = {}

  # Insert node hash into parent hash correctly.
  case hash[name]
  when Array then hash[name] << node_hash
  when Hash  then hash[name] = [hash[name], node_hash]
  when nil   then hash[name] = node_hash
  end

  # Handle child elements
  each_child do |c|
    if c.element?
      c.to_hash(node_hash)
    elsif c.text? || c.cdata?
      node_hash[CONTENT_ROOT] ||= +""
      node_hash[CONTENT_ROOT] << c.content
    end
  end

  # Remove content node if it is blank
  if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank?
    node_hash.delete(CONTENT_ROOT)
  end

  # Handle attributes
  each_attr { |a| node_hash[a.name] = a.value }

  hash
end