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
Included Modules
Class Public methods
new(stream)
Link
Source: show
# 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 )
Link
Source: show
# File lib/rexml/parsers/pullparser.rb, line 44 def add_listener( listener ) @listeners = [] unless @listeners @listeners << listener end
each()
Link
Source: show
# File lib/rexml/parsers/pullparser.rb, line 49 def each while has_next? yield self.pull end end
peek(depth=0)
Link
Source: show
# 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()
Link
Source: show
# 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