Method: MultiXml::Parsers::Libxml2Parser#node_to_hash

Defined in:
lib/multi_xml/parsers/libxml2_parser.rb

#node_to_hash(node, hash = {}) ⇒ Object

Convert XML document to hash

node:: The XML node object to convert to a hash.

hash:: Hash to merge the converted element into.


11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
# File 'lib/multi_xml/parsers/libxml2_parser.rb', line 11

def node_to_hash(node, hash = {}) # rubocop:disable Metrics/AbcSize, Metrics/CyclomaticComplexity, Metrics/MethodLength
  node_hash = {MultiXml::CONTENT_ROOT => ""}

  name = node_name(node)

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

  # Handle child elements
  each_child(node) do |c|
    if c.element?
      node_to_hash(c, node_hash)
    elsif c.text? || c.cdata?
      node_hash[MultiXml::CONTENT_ROOT] += c.content
    end
  end

  # Remove content node if it is empty
  node_hash.delete(MultiXml::CONTENT_ROOT) if node_hash[MultiXml::CONTENT_ROOT].strip.empty?

  # Handle attributes
  each_attr(node) do |a|
    key = node_name(a)
    v = node_hash[key]
    node_hash[key] = ((v) ? [a.value, v] : a.value)
  end

  hash
end