[英]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.