Class | REXML::Parsers::PullParser
In: | rexml/parsers/pullparser.rb
Parent: | Object

# 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.

### Methods

add_listener each new peek pull unshift

### Included Modules

XMLTokens

### Public Class methods

new(stream)

[Source]

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

### Public Instance methods

add_listener( listener )

[Source]

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

each() {|self.pull| ...}

[Source]

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

peek(depth=0)

[Source]

    # File rexml/parsers/pullparser.rb, line 54
          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()

[Source]

    # File rexml/parsers/pullparser.rb, line 64
          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)

[Source]

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

[Validate]