15: def parse
16: tag_stack = []
17: in_doctype = false
18: entities = nil
19: begin
20: while true
21: event = @parser.pull
22:
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:
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