Module: LibXML::Conversions::Node

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

Overview

:nodoc:

Constant Summary collapse

CONTENT_ROOT =
"__content__".freeze

Instance Method Summary collapse

Instance Method Details

#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] ||= "".dup
      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