123456789_123456789_123456789_123456789_123456789_

Class: REXML::Parsers::PullParser

Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, Forwardable
Instance Chain:
Inherits: Object
Defined in: lib/rexml/parsers/pullparser.rb

Overview

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 ::REXML::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.

Constant Summary

::REXML::XMLTokens - Included

NAME, NAMECHAR, NAME_CHAR, NAME_START_CHAR, NAME_STR, NCNAME_STR, NMTOKEN, NMTOKENS, REFERENCE

Class Method Summary

Instance Method Summary

Constructor Details

.new(stream) ⇒ PullParser

[ GitHub ]

  
# File 'lib/rexml/parsers/pullparser.rb', line 38

def initialize stream
  @entities = {}
  @listeners = nil
  @parser = BaseParser.new( stream )
  @my_stack = []
end

Instance Method Details

#add_listener(listener)

[ GitHub ]

  
# File 'lib/rexml/parsers/pullparser.rb', line 45

def add_listener( listener )
  @listeners = [] unless @listeners
  @listeners << listener
end

#each

[ GitHub ]

  
# File 'lib/rexml/parsers/pullparser.rb', line 50

def each
  while has_next?
    yield self.pull
  end
end

#peek(depth = 0)

[ GitHub ]

  
# 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

[ GitHub ]

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

[ GitHub ]

  
# File 'lib/rexml/parsers/pullparser.rb', line 81

def unshift token
  @my_stack.unshift token
end