Module: ActiveSupport::XmlMini_Nokogiri::Conversions::Node

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

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.



35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# File 'lib/active_support/xml_mini/nokogiri.rb', line 35

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
    else raise "Unexpected error during hash insertion!"
  end

  # Handle child elements
  children.each 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 and there are child tags
  if node_hash.length > 1 && node_hash[CONTENT_ROOT].blank?
    node_hash.delete(CONTENT_ROOT)
  end

  # Handle attributes
  attribute_nodes.each { |a| node_hash[a.node_name] = a.value }

  hash
end