在使用C#的XmlSerializer做对象到XML的序列化时,默认情况下输出结果往往会带上xsi和xsd相关的命名空间声明。如果业务上不需要这些默认前缀,可以通过一些简单的配置在序列化时将其去除,让生成的XML更加简洁。

为什么会有默认的xmlns
XmlSerializer为了保证序列化后的XML具备标准的架构描述能力,会自动引入如下两个命名空间:
- http://www.w3.org/2001/XMLSchema-instance
- http://www.w3.org/2001/XMLSchema
在输出的根节点上就表现为 xmlns:xsi 和 xmlns:xsd。当我们只想要纯粹的数据结构时,它们显得多余。
使用XmlSerializerNamespaces去除默认前缀
最常见的方式是创建一个 XmlSerializerNamespaces 对象,并添加一个空前缀和空命名空间,然后在调用 Serialize 方法时传入它。这样序列化器就不会再写入默认的 xsi 和 xsd 声明。
using System;
using System.IO;
using System.Text;
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()
{
User user = new User { Name = "张三", Age = 20 };
XmlSerializer serializer = new XmlSerializer(typeof(User));
// 创建空命名空间集合
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
StringBuilder sb = new StringBuilder();
using (XmlWriter writer = XmlWriter.Create(sb))
{
serializer.Serialize(writer, user, ns);
}
Console.WriteLine(sb.ToString());
}
}
}
运行上述代码,生成的XML将只包含 <User><Name>张三</Name><Age>20</Age></User>,不再出现 xmlns:xsi 等属性。
通过XmlAttributeOverrides控制类级别命名空间
如果你的类使用了 XmlRoot 并指定了命名空间,也可以通过 XmlAttributeOverrides 在运行时覆盖掉它,配合空命名空间实现统一去除。
using System;
using System.IO;
using System.Xml.Serialization;
[XmlRoot("Order", Namespace = "http://tempuri.org")]
public class Order
{
public string Id { get; set; }
}
class Test
{
static void Run()
{
XmlAttributeOverrides overrides = new XmlAttributeOverrides();
XmlAttributes attrs = new XmlAttributes();
attrs.XmlRoot = new XmlRootAttribute("Order") { Namespace = "" };
overrides.Add(typeof(Order), attrs);
XmlSerializer serializer = new XmlSerializer(typeof(Order), overrides);
XmlSerializerNamespaces ns = new XmlSerializerNamespaces();
ns.Add("", "");
Order order = new Order { Id = "1001" };
using (StringWriter sw = new StringWriter())
{
serializer.Serialize(sw, order, ns);
Console.WriteLine(sw.ToString());
}
}
}
注意事项
如果对象图中某些成员使用了 XmlElement 并显式声明了命名空间,那么即便添加了空命名空间,这些成员仍可能带上对应的 xmlns。此时需要统一将相关特性的 Namespace 设为空字符串。
去除默认 xmlns 不会影响反序列化兼容性,因为标准解析器对缺少 xsi、xsd 声明的XML同样可以正常处理。
| 方法 | 适用场景 | 复杂度 |
|---|---|---|
| XmlSerializerNamespaces加空项 | 绝大多数普通对象 | 低 |
| XmlAttributeOverrides覆盖 | 类已带命名空间需动态去掉 | 中 |
通过上述方式,你可以轻松在C#中使用 XmlSerializer 序列化时去除默认的 xmlns 命名空间前缀,输出更符合需求的XML内容。
C#XmlSerializerxmlns修改时间:2026-07-29 15:54:24