从属性值获取URI的最简单方法是什么?

时间:2012-01-16 06:13:55

标签: c# linq-to-xml uri xml-namespaces

在我的XML中,我有一个像

这样的元素
<myElement myAttribute="myNamespacePrefix:foobar"/>

此文件中有一个xmlns声明:

<xmlns:myNamespacePrefix="http://www.mydomain.com/blah#"/>

我想根据myAttribute的值创建一个URI。

IE,我想:

http://www.mydomain.com/blah#foobar

听起来很简单,不是吗?

那么简单的解决方案是什么?

我在框架或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 :(得分:0)

我最近做了一些与XML相关的事情。这是我用来从C#中获取XML信息的一个例子:

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();
}