我有一个像这样的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对象。有可能将其删除吗?我试过How to remove namespace prefix. (C#),该元素仍然有一个默认的命名空间。
<Credentials xmlns="urn:My-Namespace">
<UserName>foo</UserName>
<Domain>bar</Domain>
</Credentials>
答案 0 :(得分:1)
MSDN中有一篇文章可以根据您的需要进行调整:How to: Change the Namespace for an Entire XML Tree
基本上,本文建议将树中每个Name
的{{1}}更改为新的XElement
(FYI,Name
属性包含有关命名空间和本地名称的信息)。在这种情况下,由于我们希望将每个元素更改为无命名空间,因此您可以将Name
更改为相应的Name
:
Name.LocalName
答案 1 :(得分:0)
感谢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;
}