17: def validate( event )
18:
19:
20: @attr_stack = [] unless defined? @attr_stack
21: match = @current.next(event)
22: raise ValidationException.new( "Validation error. Expected: "+
23: @current.expected.join( " or " )+" from #{@current.inspect} "+
24: " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match
25: @current = match
26:
27:
28: case event[0]
29: when :start_element
30:
31: @attr_stack << event[2]
32: begin
33: sattr = [:start_attribute, nil]
34: eattr = [:end_attribute]
35: text = [:text, nil]
36: k,v = event[2].find { |k,v|
37: sattr[1] = k
38:
39: m = @current.next( sattr )
40:
41: if m
42:
43:
44:
45: if m.matches?( eattr )
46:
47: @current = m
48: else
49:
50: text[1] = v
51:
52: m = m.next( text )
53:
54: text[1] = nil
55: return false unless m
56: @current = m if m
57: end
58: m = @current.next( eattr )
59: if m
60: @current = m
61: true
62: else
63: false
64: end
65: else
66: false
67: end
68: }
69: event[2].delete(k) if k
70: end while k
71: when :end_element
72: attrs = @attr_stack.pop
73: raise ValidationException.new( "Validation error. Illegal "+
74: " attributes: #{attrs.inspect}") if attrs.length > 0
75: end
76: end