Самый простой способ получить URI из значения атрибута? - PullRequest
0 голосов
/ 16 января 2012

В моем 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);
            }
        }

1 Ответ

0 голосов
/ 16 января 2012

Недавно я сделал кое-что, связанное с XML.Это пример того, что я использовал для получения информации из XML в C #:

XmlDocument XML = new XmlDocument();
XML.LoadXml(/* XML data in string format goes here */);

Затем вы можете сделать следующее:

if (XML["myElement"] != null)
{
    string myAttributeStr = XML["myElement"].Attributes["myAttribute"].Value.ToString().Trim();
}
...