Class REXML::Parsers::PullParser
In: lib/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

[Source]

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

Public Instance methods

[Source]

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

[Source]

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

[Source]

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

[Source]

    # File lib/rexml/parsers/pullparser.rb, line 65
65:       def pull
66:         return @my_stack.shift if @my_stack.length > 0
67: 
68:         event = @parser.pull
69:         case event[0]
70:         when :entitydecl
71:           @entities[ event[1] ] = 
72:             event[2] unless event[2] =~ /PUBLIC|SYSTEM/
73:         when :text
74:           unnormalized = @parser.unnormalize( event[1], @entities )
75:           event << unnormalized
76:         end
77:         PullEvent.new( event )
78:       end

[Source]

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

[Validate]