# File rexml/document.rb, line 291
    def parse( source )
      begin 
	while not source.empty?
	  source.match( /^\s*/um, true )
	  word = source.match( /^(<.*?)>/um )
	  word = word[1] unless word.nil?
	  case word
	  when nil
	    word = source.match( /\s*(\S+)/um, true )
	    return if word.nil?
	    raise ParseException.new( "data found outside of root element (data is '#{word}')", source ) if word[0].strip.length > 0
	  when Comment::START_RE
	    self.add( Comment.new( source ) )
	  when DocType::START_RE
	    self.add( DocType.new( source ) )
	  when XMLDecl::START_RE
	    x = XMLDecl.new( source )
	    source.encoding = x.encoding
	    self.add( x )
	  when Instruction::START_RE
	    self.add( Instruction.new(source) )
	  else
	    Element.new( source, self, @context )
	  end
	end
	unless @elements.size == 1
	  #@children.find_all{|x| puts x if x.kind_of? Element }
	  raise "the document does not have exactly one root"
	end
      rescue ParseException
	$!.source = source
	$!.element = self
	raise
      rescue Exception
	old_ex = $!
	raise ParseException.new("unidentified error", source, self, old_ex)
      end
    end