Google

def Element.parse_stream source, listener begin # Get the next tag name, closed, attrs = base_parser(source) attrs.each { |ar| ar[1,1] = [] } listener.tag_start name, attrs unless closed while true md = source.match(/\A(\s*[^>]*>)/um) raise ParseException.new("malformed XML: bad content", source, self) unless md line = md[1] return if line.nil? case line when /\A<[\w_:]/um Element.parse_stream source, listener when /\A<\//um break when CData::START_RE CData.parse_stream source, listener when Comment::START_RE Comment.parse_stream source, listener when Instruction::START_RE Instruction.parse_stream source, listener else raise ParseException.new("malformed XML: bad content", source ) if md[1][0] == ?< Text.parse_stream source, listener end end #nregexp = Regexp.new("^\s*<\/#{name}\s*>", Regexp::MULTILINE, 'u') #if source.match(nregexp, true) if source.match(/^\s*<\/#{name}\s*>/, true) listener.tag_end name else raise ParseException.new( "Missing end tag for #{name}", source ) end else listener.tag_end name end rescue ParseException $!.source = source $!.element = self if self.kind_of? Element raise rescue Exception raise old_ex = $! raise ParseException.new("unidentified error", source, self, old_ex) end end