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
A
E
N
P
U
Included Modules
Class Public methods
new(stream)
# File lib/rexml/parsers/pullparser.rb, line 37
def initialize stream
  @entities = {}
  @listeners = nil
  @parser = BaseParser.new( stream )
  @my_stack = []
end
Instance Public methods
add_listener( listener )
# File lib/rexml/parsers/pullparser.rb, line 44
def add_listener( listener )
  @listeners = [] unless @listeners
  @listeners << listener
end
each()
# File lib/rexml/parsers/pullparser.rb, line 49
def each
  while has_next?
    yield self.pull
  end
end
peek(depth=0)
# File lib/rexml/parsers/pullparser.rb, line 55
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()
# File lib/rexml/parsers/pullparser.rb, line 65
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)
# File lib/rexml/parsers/pullparser.rb, line 80
def unshift token
  @my_stack.unshift token
end