class REXML::Parsers::BaseParser
def parse_attributes(prefixes)
def parse_attributes(prefixes) attributes = {} expanded_names = {} closed = false while true if @source.match?(">", true) return attributes, closed elsif @source.match?("/>", true) closed = true return attributes, closed elsif match = @source.match(QNAME, true) name = match[1] prefix = match[2] local_part = match[3] unless @source.match?(/\s*=\s*/um, true) message = "Missing attribute equal: <#{name}>" raise REXML::ParseException.new(message, @source) end unless quote = scan_quote message = "Missing attribute value start quote: <#{name}>" raise REXML::ParseException.new(message, @source) end start_position = @source.position value = @source.read_until(quote) unless value.chomp!(quote) @source.position = start_position message = "Missing attribute value end quote: <#{name}>: <#{quote}>" raise REXML::ParseException.new(message, @source) end @source.match?(/\s*/um, true) if prefix == "xmlns" if local_part == "xml" if value != Private::XML_PREFIXED_NAMESPACE msg = "The 'xml' prefix must not be bound to any other namespace "+ "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" raise REXML::ParseException.new( msg, @source, self ) end elsif local_part == "xmlns" msg = "The 'xmlns' prefix must not be declared "+ "(http://www.w3.org/TR/REC-xml-names/#ns-decl)" raise REXML::ParseException.new( msg, @source, self) end add_namespace(local_part, value) elsif prefix prefixes << prefix unless prefix == "xml" end if attributes[name] msg = "Duplicate attribute #{name.inspect}" raise REXML::ParseException.new(msg, @source, self) end unless prefix == "xmlns" uri = @namespaces[prefix] expanded_name = [uri, local_part] existing_prefix = expanded_names[expanded_name] if existing_prefix message = "Namespace conflict in adding attribute " + "\"#{local_part}\": " + "Prefix \"#{existing_prefix}\" = \"#{uri}\" and " + "prefix \"#{prefix}\" = \"#{uri}\"" raise REXML::ParseException.new(message, @source, self) end expanded_names[expanded_name] = prefix end attributes[name] = value else message = "Invalid attribute name: <#{@source.buffer.split(%r{[/>\s]}).first}>" raise REXML::ParseException.new(message, @source) end end end