# class REXML::Parsers::StreamParser

### Public Class Methods

new(source, listener) click to toggle source

    # File lib/rexml/parsers/streamparser.rb, line 6
    def initialize source, listener
      @listener = listener
      @parser = BaseParser.new( source )
      @tag_stack = []
    end

### Public Instance Methods

add_listener( listener ) click to toggle source

    # File lib/rexml/parsers/streamparser.rb, line 12
    def add_listener( listener )
      @parser.add_listener( listener )
    end

parse() click to toggle source

    # File lib/rexml/parsers/streamparser.rb, line 16
    def parse
      # entity string
      while true
        event = @parser.pull
        case event[0]
        when :end_document
          unless @tag_stack.empty?
            tag_path = "/" + @tag_stack.join("/")
            raise ParseException.new("Missing end tag for '#{tag_path}'",
                                     @parser.source)
          end
          return
        when :start_element
          @tag_stack << event[1]
          attrs = event[2].each do |n, v|
            event[2][n] = @parser.unnormalize( v )
          end
          @listener.tag_start( event[1], attrs )
        when :end_element
          @listener.tag_end( event[1] )
          @tag_stack.pop
        when :text
          normalized = @parser.unnormalize( event[1] )
          @listener.text( normalized )
        when :processing_instruction
          @listener.instruction( *event[1,2] )
        when :start_doctype
          @listener.doctype( *event[1..-1] )
        when :end_doctype
          # FIXME: remove this condition for milestone:3.2
          @listener.doctype_end if @listener.respond_to? :doctype_end
        when :comment, :attlistdecl, :cdata, :xmldecl, :elementdecl
          @listener.send( event[0].to_s, *event[1..-1] )
        when :entitydecl, :notationdecl
          @listener.send( event[0].to_s, event[1..-1] )
        when :externalentity
          entity_reference = event[1]
          content = entity_reference.gsub(/\A%|;\z/, "")
          @listener.entity(content)
        end
      end
    end