Class: REXML::Parsers::PullParser
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 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
Constants included from XMLTokens
XMLTokens::NAME, XMLTokens::NAMECHAR, XMLTokens::NAME_CHAR, XMLTokens::NAME_START_CHAR, XMLTokens::NAME_STR, XMLTokens::NCNAME_STR, XMLTokens::NMTOKEN, XMLTokens::NMTOKENS, XMLTokens::REFERENCE
Instance Method Summary collapse
- #add_listener(listener) ⇒ Object
- #each ⇒ Object
-
#initialize(stream) ⇒ PullParser
constructor
A new instance of PullParser.
- #peek(depth = 0) ⇒ Object
- #pull ⇒ Object
- #unshift(token) ⇒ Object
Constructor Details
permalink #initialize(stream) ⇒ PullParser
Returns a new instance of PullParser.
38 39 40 41 42 43 |
# File 'lib/rexml/parsers/pullparser.rb', line 38 def initialize stream @entities = {} @listeners = nil @parser = BaseParser.new( stream ) @my_stack = [] end |
Instance Method Details
permalink #add_listener(listener) ⇒ Object
[View source]
45 46 47 48 |
# File 'lib/rexml/parsers/pullparser.rb', line 45 def add_listener( listener ) @listeners = [] unless @listeners @listeners << listener end |
permalink #each ⇒ Object
[View source]
50 51 52 53 54 |
# File 'lib/rexml/parsers/pullparser.rb', line 50 def each while has_next? yield self.pull end end |
permalink #peek(depth = 0) ⇒ Object
[View source]
56 57 58 59 60 61 62 63 64 |
# 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 |
permalink #pull ⇒ Object
[View source]
66 67 68 69 70 71 72 73 74 75 76 77 78 79 |
# 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 |
permalink #unshift(token) ⇒ Object
[View source]
81 82 83 |
# File 'lib/rexml/parsers/pullparser.rb', line 81 def unshift token @my_stack.unshift token end |