Class REXML::Parsers::TreeParser
In: lib/rexml/parsers/treeparser.rb
Parent: Object

Methods

add_listener   new   parse  

Public Class methods

[Source]

   # File lib/rexml/parsers/treeparser.rb, line 6
6:       def initialize( source, build_context = Document.new )
7:         @build_context = build_context
8:         @parser = Parsers::BaseParser.new( source )
9:       end

Public Instance methods

[Source]

    # File lib/rexml/parsers/treeparser.rb, line 11
11:       def add_listener( listener )
12:         @parser.add_listener( listener )
13:       end

[Source]

    # File lib/rexml/parsers/treeparser.rb, line 15
15:       def parse
16:         tag_stack = []
17:         in_doctype = false
18:         entities = nil
19:         begin
20:           while true
21:             event = @parser.pull
22:             #STDERR.puts "TREEPARSER GOT #{event.inspect}"
23:             case event[0]
24:             when :end_document
25:               unless tag_stack.empty?
26:                 raise ParseException.new("No close tag for #{tag_stack.inspect}")
27:               end
28:               return
29:             when :start_element
30:               tag_stack.push(event[1])
31:               # find the observers for namespaces
32:               @build_context = @build_context.add_element( event[1], event[2] )
33:             when :end_element
34:               tag_stack.pop
35:               @build_context = @build_context.parent
36:             when :text
37:               if not in_doctype
38:                 if @build_context[-1].instance_of? Text
39:                   @build_context[-1] << event[1]
40:                 else
41:                   @build_context.add( 
42:                     Text.new(event[1], @build_context.whitespace, nil, true) 
43:                   ) unless (
44:                     @build_context.ignore_whitespace_nodes and
45:                     event[1].strip.size==0
46:                   )
47:                 end
48:               end
49:             when :comment
50:               c = Comment.new( event[1] )
51:               @build_context.add( c )
52:             when :cdata
53:               c = CData.new( event[1] )
54:               @build_context.add( c )
55:             when :processing_instruction
56:               @build_context.add( Instruction.new( event[1], event[2] ) )
57:             when :end_doctype
58:               in_doctype = false
59:               entities.each { |k,v| entities[k] = @build_context.entities[k].value }
60:               @build_context = @build_context.parent
61:             when :start_doctype
62:               doctype = DocType.new( event[1..-1], @build_context )
63:               @build_context = doctype
64:               entities = {}
65:               in_doctype = true
66:             when :attlistdecl
67:               n = AttlistDecl.new( event[1..-1] )
68:               @build_context.add( n )
69:             when :externalentity
70:               n = ExternalEntity.new( event[1] )
71:               @build_context.add( n )
72:             when :elementdecl
73:               n = ElementDecl.new( event[1] )
74:               @build_context.add(n)
75:             when :entitydecl
76:               entities[ event[1] ] = event[2] unless event[2] =~ /PUBLIC|SYSTEM/
77:               @build_context.add(Entity.new(event))
78:             when :notationdecl
79:               n = NotationDecl.new( *event[1..-1] )
80:               @build_context.add( n )
81:             when :xmldecl
82:               x = XMLDecl.new( event[1], event[2], event[3] )
83:               @build_context.add( x )
84:             end
85:           end
86:         rescue REXML::Validation::ValidationException
87:           raise
88:         rescue
89:           raise ParseException.new( $!.message, @parser.source, @parser, $! )
90:         end
91:       end

[Validate]