繁体   English   中英

如何摆脱像这样(C#)的XElement的命名空间前缀?

[英]How can I get rid of the namespace prefix from XElement like this (C#)?

我有一个像这样的xml字符串,并且我试图将其反序列化为带有Credentials类的对象。 但是名称空间前缀使我停了下来。

Credentials类本身没有任何XmlRoot属性来设置名称空间。 但是某些包含Credentials属性的类却可以。 下面的“ ds”前缀来自容器的序列化xml。

容器的xml如下所示:

<ds:DataSource xmlns:ds="urn:My-Namespace">
    <ds:Credentials>
        <ds:UserName>foo</ds:UserName>
        <ds:Domain>bar</ds:Domain>
    </ds:Credentials>
</ds:DataSource>"

然后,当我从containter元素获取元素“ Credentials”时,它返回以下内容:

<ds:Credentials xmlns:ds="urn:My-Namespace">
    <ds:UserName>foo</ds:UserName>
    <ds:Domain>bar</ds:Domain>
</ds:Credentials>

由于多余的命名空间,我无法将其反序列化为正确的Credentials对象。 有可能将其删除吗? 我尝试过如何删除名称空间前缀。 (C#) ,该元素仍然在此处具有默认名称空间。

<Credentials xmlns="urn:My-Namespace">
    <UserName>foo</UserName>
    <Domain>bar</Domain>
</Credentials>

MSDN中有一篇文章,可以根据您的需要进行修改: 如何:更改整个XML树的命名空间

基本上,本文建议将树中每个XElement Name更改为新的Name (FYI, Name属性包含有关名称空间和本地名称的信息)。 在这种情况下,由于我们希望将每个元素更改为无名称空间,因此可以将Name更改为相应的Name.LocalName

var xml = @"<ds:DataSource xmlns:ds=""urn:My-Namespace"">
    <ds:Credentials>
        <ds:UserName>foo</ds:UserName>
        <ds:Domain>bar</ds:Domain>
    </ds:Credentials>
</ds:DataSource>";
var tree1 = XElement.Parse(xml);
foreach (XElement el in tree1.DescendantsAndSelf())
{
    el.Name = el.Name.LocalName;
    List<XAttribute> atList = el.Attributes().ToList();
    el.Attributes().Remove();
    foreach (XAttribute at in atList)
        el.Add(new XAttribute(at.Name.LocalName, at.Value));
}
//remove xmlns:ds="urn:My-Namespace"
tree1.RemoveAttributes();
//print result to console
Console.WriteLine(tree1.ToString());

感谢har07和http://bohu7.wordpress.com/2008/12/11/removing-default-namespaces-from-an-xdocument/的启发,我自己制定了解决方案,它将保留常规属性并删除其他名称空间:

    public static void RemoveNamespace(this XElement element)
    {
        foreach (XElement e in element.DescendantsAndSelf())
        {
            if (e.Name.Namespace != XNamespace.None)
                e.Name = e.Name.LocalName;

            if (e.Attributes().Any(a => a.IsNamespaceDeclaration || a.Name.Namespace != XNamespace.None))
                e.ReplaceAttributes(e.Attributes().Select(NoNamespaceAttribute));
        }
    }

    private static XAttribute NoNamespaceAttribute(XAttribute attribute)
    {
        return attribute.IsNamespaceDeclaration
            ? null
            : attribute.Name.Namespace != XNamespace.None
                ? new XAttribute(attribute.Name.LocalName, attribute.Value)
                : attribute;
    }

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM