Sha256: 0b4633cea4c18ad4cda5f859edb1824c1c009ea526c45f29d19212df4e9c7f55

Contents?: true

Size: 1.86 KB

Versions: 270

Compression:

Stored size: 1.86 KB

Contents

require 'libxml'
require 'active_support/core_ext/object/blank'
require 'stringio'

# = XmlMini LibXML implementation
module ActiveSupport
  module XmlMini_LibXML #:nodoc:
    extend self

    # Parse an XML Document string or IO into a simple hash using libxml.
    # data::
    #   XML Document string or IO to parse
    def parse(data)
      if !data.respond_to?(:read)
        data = StringIO.new(data || '')
      end

      char = data.getc
      if char.nil?
        {}
      else
        data.ungetc(char)
        LibXML::XML::Parser.io(data).parse.to_hash
      end
    end

  end
end

module LibXML #:nodoc:
  module Conversions #:nodoc:
    module Document #:nodoc:
      def to_hash
        root.to_hash
      end
    end

    module Node #:nodoc:
      CONTENT_ROOT = '__content__'.freeze

      # Convert XML document to hash
      #
      # hash::
      #   Hash to merge the converted element into.
      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
    end
  end
end

LibXML::XML::Document.send(:include, LibXML::Conversions::Document)
LibXML::XML::Node.send(:include, LibXML::Conversions::Node)

Version data entries

270 entries across 226 versions & 25 rubygems

Version Path
mdg-1.0.1 vendor/bundle/ruby/2.3.0/gems/activesupport-3.2.22.5/lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22.5 lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22.4 lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22.3 lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22.2 lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22.1 lib/active_support/xml_mini/libxml.rb
classiccms-0.7.5 vendor/bundle/gems/activesupport-3.2.3/lib/active_support/xml_mini/libxml.rb
classiccms-0.7.4 vendor/bundle/gems/activesupport-3.2.3/lib/active_support/xml_mini/libxml.rb
classiccms-0.7.3 vendor/bundle/gems/activesupport-3.2.3/lib/active_support/xml_mini/libxml.rb
active_mailer-0.0.10 test/fixtures/dummyapp_rails_3.2/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.12/lib/active_support/xml_mini/libxml.rb
activesupport-3.2.22 lib/active_support/xml_mini/libxml.rb
judge-2.0.5 vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.12/lib/active_support/xml_mini/libxml.rb
activesupport-3.2.21 lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/1.8/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/2.1.0/gems/apl-library-0.0.90/vendor/bundle/ruby/1.8/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/2.1.0/gems/apl-library-0.0.90/vendor/bundle/ruby/1.9.1/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
apl-library-0.0.90 vendor/bundle/ruby/2.1.0/gems/apl-library-0.0.90/vendor/bundle/ruby/2.1.0/gems/activesupport-3.2.18/lib/active_support/xml_mini/libxml.rb
activesupport-3.2.20 lib/active_support/xml_mini/libxml.rb