Sha256: e7b403a51b19353403381543d16f74039773e344e48ece7393329e7d0f2a3afb

Contents?: true

Size: 1.04 KB

Versions: 3

Compression:

Stored size: 1.04 KB

Contents

require 'ox'
require 'stringio'

module Badgerfish
  class OxSaxParser < Ox::Sax

    def load(xml)
      @result = @root = {}
      @parents = []
      Ox.sax_parse(self, StringIO.new(xml))
      @result
    end

    #
    # sax callbacks
    #
    def start_element(name)
      new_element = {}
      name = name.to_s # force string representation of symbols

      if @root[name].nil?
        @root[name] = new_element
      else
        @root[name] = [@root[name]] unless @root[name].is_a?(Array)
        @root[name].push new_element
      end

      @parents.push @root
      @root = new_element
    end

    def end_element(name)
      @root = @parents.pop
    end

    def attr(name, value)
      unless name.to_s.start_with? 'xmlns'
        @root["@#{name}"] = value
      else
        @root['@xmlns'] ||= {}

        if name.to_s.start_with? 'xmlns:'
          @root['@xmlns'][name[6, name.length]] = value
        else
          @root['@xmlns']['$'] = value
        end
      end
    end

    def text(value)
      @root['$'] = value
    end

  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
badgerfish-0.0.5 lib/badgerfish/ox_sax_parser.rb
badgerfish-0.0.4 lib/badgerfish/ox_sax_parser.rb
badgerfish-0.0.3 lib/badgerfish/ox_sax_parser.rb