コード例 #1
0
        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);
            }
        }