在C#开发中,使用XmlSerializer将对象序列化为XML时,默认输出会包含xmlns:xsi和xmlns:xsd等命名空间属性。如果对接的接口要求纯净的XML结构,就需要把这些xmlns属性去掉。下面介绍一种简洁有效的写法。

使用空命名空间集合
核心思路是创建一个XmlSerializerNamespaces实例,不添加任何命名空间,然后在序列化时传入它,这样生成的XML就不会带默认的xmlns属性。
示例代码
using System;
using System.IO;
using System.Xml;
using System.Xml.Serialization;
namespace Demo
{
[XmlRoot("User")]
public class User
{
public string Name { get; set; }
public int Age { get; set; }
}
class Program
{
static void Main()
{
// 创建测试对象
var user = new User { Name = "张三", Age = 28 };
// 定义不包含任何命名空间的集合
var ns = new XmlSerializerNamespaces();
ns.Add("", "");
var serializer = new XmlSerializer(typeof(User));
var settings = new XmlWriterSettings
{
OmitXmlDeclaration = true, // 可选:去掉XML声明
Indent = true
};
using (var writer = XmlWriter.Create(Console.Out, settings))
{
serializer.Serialize(writer, user, ns);
}
}
}
}
输出结果
上述代码会输出如下内容,可以看到已经没有xmlns属性:
<User> <Name>张三</Name> <Age>28</Age> </User>
注意事项
- 如果对象使用了
XmlRoot特性并指定了Namespace,需要将其改为空字符串才能彻底去掉命名空间。 - 该方法不会影响对象本身的字段序列化,仅控制命名空间输出。
- 对于需要保留自定义命名空间但去掉标准xsi、xsd的场景,只需在XmlSerializerNamespaces中添加你需要的前缀和URI即可。
总结
通过XmlSerializerNamespaces并调用Add("", "")是最简洁的移除xmlns写法,代码改动小且易维护。配合XmlWriterSettings还能进一步控制声明和格式,满足大多数去命名空间需求。