public string RegisterNamespace(string namespaceUri, string suggestedPrefix) { lock (_lock) { ParameterAsserts.AssertSchemaNs(namespaceUri); ParameterAsserts.AssertPrefix(suggestedPrefix); if (suggestedPrefix[suggestedPrefix.Length - 1] != ':') { suggestedPrefix += ':'; } if (!Utils.IsXmlNameNs(suggestedPrefix.Substring(0, suggestedPrefix.Length - 1 - 0))) { throw new XmpException("The prefix is a bad XML name", XmpErrorCode.BadXml); } string registeredPrefix; if (_namespaceToPrefixMap.TryGetValue(namespaceUri, out registeredPrefix)) { // Return the actual prefix return(registeredPrefix); } if (_prefixToNamespaceMap.ContainsKey(suggestedPrefix)) { // the namespace is new, but the prefix is already engaged, // we generate a new prefix out of the suggested var generatedPrefix = suggestedPrefix; for (var i = 1; _prefixToNamespaceMap.ContainsKey(generatedPrefix); i++) { generatedPrefix = suggestedPrefix.Substring(0, suggestedPrefix.Length - 1 - 0) + "_" + i + "_:"; } suggestedPrefix = generatedPrefix; } _prefixToNamespaceMap[suggestedPrefix] = namespaceUri; _namespaceToPrefixMap[namespaceUri] = suggestedPrefix; // Return the suggested prefix return(suggestedPrefix); } }