# class REXML::Parsers::PullParser

# Using the Pull Parser¶ ↑

This API is experimental, and subject to change.

    parser = PullParser.new( "<a>text<b att='val'/>txet</a>" )
    while parser.has_next?
      res = parser.next
      puts res[1]['att'] if res.start_tag? and res[0] == 'b'
    end

See the `PullEvent` class for information on the content of the results. The data is identical to the arguments passed for the various events to the `StreamListener` API.

Notice that:

    parser = PullParser.new( "<a>BAD DOCUMENT" )
    while parser.has_next?
      res = parser.next
      raise res[1] if res.error?
    end

Nat Price gave me some good ideas for the API.

### Public Class Methods

new(stream) click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 38
    def initialize stream
      @entities = {}
      @listeners = nil
      @parser = BaseParser.new( stream )
      @my_stack = []
    end

### Public Instance Methods

add_listener( listener ) click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 45
    def add_listener( listener )
      @listeners = [] unless @listeners
      @listeners << listener
    end

each() { |pull| ... } click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 50
    def each
      while has_next?
        yield self.pull
      end
    end

peek(depth=0) click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 56
    def peek depth=0
      if @my_stack.length <= depth
        (depth - @my_stack.length + 1).times {
          e = PullEvent.new(@parser.pull)
          @my_stack.push(e)
        }
      end
      @my_stack[depth]
    end

pull() click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 66
    def pull
      return @my_stack.shift if @my_stack.length > 0

      event = @parser.pull
      case event[0]
      when :entitydecl
        @entities[ event[1] ] =
          event[2] unless event[2] =~ /PUBLIC|SYSTEM/
      when :text
        unnormalized = @parser.unnormalize( event[1], @entities )
        event << unnormalized
      end
      PullEvent.new( event )
    end

unshift(token) click to toggle source

    # File lib/rexml/parsers/pullparser.rb, line 81
    def unshift token
      @my_stack.unshift token
    end