static public bool DevolveURIWithNamespace(INamespaceMapper mapper, string s, out string uri, out string prefix, out string atom)
            {
                atom   = null;
                uri    = null;
                prefix = null;
                foreach (var pfx in LockInfo.WithLock <IEnumerable <string> >(mapper, mapper.Prefixes.ToArray))
                {
                    prefix = pfx;
                    var uril = LockInfo.WithLock(mapper, () => mapper.GetNamespaceUri(pfx));
                    uri = uril.ToString();
                    int len = uri.Length;
                    if (len > 0 && s.StartsWith(uri))
                    {
                        if (String.IsNullOrEmpty(prefix))
                        {
                            prefix = LockInfo.WithLock(mapper, () => mapper.GetPrefix(uril));
                        }
                        atom = s.Substring(len);
                        return(true);
                    }
                    string prefixc = prefix + ":";
                    if (s.StartsWith(prefixc))
                    {
                        atom = s.Substring(prefixc.Length);
                        return(true);
                    }
                }
                atom   = null;
                uri    = null;
                prefix = null;

                return(false);
            }
예제 #2
0
        private static string Uri2QName(SNamespaceMap mapLocal, string uri, INamespaceMapper globalNamespaceMaper)
        {
            string qname;

            if (mapLocal.ReduceToQName(uri, out qname))
            {
                return(qname);
            }
            string shortName;
            Uri    urlNs;

            SplitUrl(uri, out shortName, out urlNs);
            var prefix = globalNamespaceMaper.GetPrefix(urlNs);

            if (prefix == null)
            {
                string p = "ns";
                int    i = 0;
                while (mapLocal.HasNamespace(prefix = p + i + ":") ||
                       globalNamespaceMaper.HasNamespace(prefix))
                {
                    i++;
                }
            }
            mapLocal.AddNamespace(prefix, urlNs);
            return(prefix + shortName);
        }