Sha256: b644eb4e30538dc43132a4f8cd1ed1d41693ba5dbe1a2d64ac7d6180eb2d7328

Contents?: true

Size: 1.89 KB

Versions: 125

Compression:

Stored size: 1.89 KB

Contents

module MultiXml
  module Parsers
    module Libxml2Parser #:nodoc:
      # Convert XML document to hash
      #
      # node::
      #   The XML node object to convert to a hash.
      #
      # hash::
      #   Hash to merge the converted element into.
      def node_to_hash(node, hash = {}) # rubocop:disable AbcSize, CyclomaticComplexity, MethodLength, PerceivedComplexity
        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
        if node_hash[MultiXml::CONTENT_ROOT].strip.empty?
          node_hash.delete(MultiXml::CONTENT_ROOT)
        end

        # 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

      # Parse an XML Document IO into a simple hash.
      # xml::
      #   XML Document IO to parse
      def parse(_)
        raise(NotImplementedError.new("inheritor should define #{__method__}"))
      end

    private

      def each_child(*)
        raise(NotImplementedError.new("inheritor should define #{__method__}"))
      end

      def each_attr(*)
        raise(NotImplementedError.new("inheritor should define #{__method__}"))
      end

      def node_name(*)
        raise(NotImplementedError.new("inheritor should define #{__method__}"))
      end
    end
  end
end

Version data entries

125 entries across 99 versions & 6 rubygems

Version Path
harbr-0.1.99 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.98 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.97 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.96 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.95 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.94 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.93 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.91 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.90 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.89 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.88 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.87 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.86 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.85 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.84 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.83 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.82 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.81 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.80 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb
harbr-0.1.79 vendor/bundle/ruby/3.2.0/gems/multi_xml-0.6.0/lib/multi_xml/parsers/libxml2_parser.rb