Sha256: d193c2ebb5fac92d2560708a24a0012cbfc9a97c2a98bc16ddfe59b37f2af2d9

Contents?: true

Size: 1.87 KB

Versions: 110

Compression:

Stored size: 1.87 KB

Contents

require 'nokogiri'

# = XmlMini Nokogiri implementation
module ActiveSupport
  module XmlMini_Nokogiri #:nodoc:
    extend self

    # Parse an XML Document string into a simple hash using libxml / nokogiri.
    # string::
    #   XML Document string to parse
    def parse(string)
      if string.blank?
        {}
      else
        doc = Nokogiri::XML(string)
        raise doc.errors.first if doc.errors.length > 0
        doc.to_hash
      end
    end

    module Conversions
      module Document
        def to_hash
          root.to_hash
        end
      end

      module Node
        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
            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
      end
    end

    Nokogiri::XML::Document.send(:include, Conversions::Document)
    Nokogiri::XML::Node.send(:include, Conversions::Node)
  end
end

Version data entries

110 entries across 80 versions & 7 rubygems

Version Path
depengine-0.0.1 etc/isolate/jruby-1.8/gems/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
depengine-0.0.1 etc/isolate/ruby-1.8/gems/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
activesupport-2.3.16 lib/active_support/xml_mini/nokogiri.rb
activesupport-2.3.15 lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.6.4 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.6.3 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.6.2 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.6.1 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.6.0 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.5.9 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
radiant-1.0.0 ruby-debug/ruby/1.8/gems/activesupport-2.3.14/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.5.8 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
vanity-1.7.1 vendor/ruby/1.9.1/gems/activesupport-2.3.12/lib/active_support/xml_mini/nokogiri.rb
activesupport-2.3.14 lib/active_support/xml_mini/nokogiri.rb
kajam-1.0.3.rc2 vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb
activesupport-2.3.12 lib/active_support/xml_mini/nokogiri.rb
radiant-1.0.0.rc2 vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb
radiant-1.0.0.rc1 vendor/rails/activesupport/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.5.3 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb
abiquo-etk-0.4.42 vendor/activesupport-2.3.8/lib/active_support/xml_mini/nokogiri.rb