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