В моем XML есть элемент вроде
<myElement myAttribute="myNamespacePrefix:foobar"/>
В этом файле есть объявление xmlns:
<xmlns:myNamespacePrefix="http://www.mydomain.com/blah#"/>
Я хочу создать URI из значения myAttribute.
То есть, я хочу:
http://www.mydomain.com/blah#foobar
Звучит просто, не правда ли?
Так, каково простое решение?
Я не смог найти что-либо в Framework или MSDN, поэтому мне просто пришлось написать этот беспрекословный беспорядок:
public static Uri GetUri(string value, XElement containingElement)
{
if (value.Contains(":"))
{
var prefix = String.Concat(value.TakeWhile(c => c != ':'));
XNamespace ns;
if (containingElement.GetNamespaceOfPrefix(prefix) != null)
ns = containingElement.GetNamespaceOfPrefix(prefix);
else ns = containingElement.GetDefaultNamespace();
var localName = String.Concat(value.SkipWhile(c => c != ':').Skip(1));
Contract.Assert(ns != null);
if (String.IsNullOrWhiteSpace(ns.NamespaceName))
return new Uri(value);
else
{
StringBuilder sb = new StringBuilder(ns.NamespaceName);
if (!ns.NamespaceName.EndsWith("#"))
{
sb.Append('#');
}
return new Uri(String.Format(CultureInfo.CurrentCulture, "{0}{1}", sb.ToString(), localName));
}
}
else // no namespace prefix
{
String fragment;
if (!value.StartsWith("#"))
fragment = value.Insert(0, "#");
else
fragment = value;
var uriString = String.Format(CultureInfo.CurrentCulture, "{0}{1}", containingElement.BaseUri, fragment);
return new Uri(uriString);
}
}