# module REXML::Validation::Validator

### Constants

NILEVENT

### Public Instance Methods

dump() click to toggle source

    # File lib/rexml/validation/validation.rb, line 15
    def dump
      puts @root.inspect
    end

reset() click to toggle source

    # File lib/rexml/validation/validation.rb, line 8
    def reset
      @current = @root
      @root.reset
      @root.previous = true
      @attr_stack = []
      self
    end

validate( event ) click to toggle source

    # File lib/rexml/validation/validation.rb, line 18
    def validate( event )
      @attr_stack = [] unless defined? @attr_stack
      match = @current.next(event)
      raise ValidationException.new( "Validation error.  Expected: "+
        @current.expected.join( " or " )+" from #{@current.inspect} "+
        " but got #{Event.new( event[0], event[1] ).inspect}" ) unless match
      @current = match

      # Check for attributes
      case event[0]
      when :start_element
        @attr_stack << event[2]
        begin
          sattr = [:start_attribute, nil]
          eattr = [:end_attribute]
          text = [:text, nil]
          k, = event[2].find { |key,value|
            sattr[1] = key
            m = @current.next( sattr )
            if m
              # If the state has text children...
              if m.matches?( eattr )
                @current = m
              else
                text[1] = value
                m = m.next( text )
                text[1] = nil
                return false unless m
                @current = m if m
              end
              m = @current.next( eattr )
              if m
                @current = m
                true
              else
                false
              end
            else
              false
            end
          }
          event[2].delete(k) if k
        end while k
      when :end_element
        attrs = @attr_stack.pop
        raise ValidationException.new( "Validation error.  Illegal "+
          " attributes: #{attrs.inspect}") if attrs.length > 0
      end
    end