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 rexml-3.3.8/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 rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 45
def add_listener( listener )
  @listeners = [] unless @listeners
  @listeners << listener
end
each() { |pull| ... } click to toggle source
# File rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 62
def each
  while has_next?
    yield self.pull
  end
end
entity_expansion_count() click to toggle source
# File rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 50
def entity_expansion_count
  @parser.entity_expansion_count
end
entity_expansion_limit=( limit ) click to toggle source
# File rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 54
def entity_expansion_limit=( limit )
  @parser.entity_expansion_limit = limit
end
entity_expansion_text_limit=( limit ) click to toggle source
# File rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 58
def entity_expansion_text_limit=( limit )
  @parser.entity_expansion_text_limit = limit
end
peek(depth=0) click to toggle source
# File rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 68
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 rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 78
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 rexml-3.3.8/lib/rexml/parsers/pullparser.rb, line 93
def unshift token
  @my_stack.unshift token
end