C# XmlSerializer序列化时如何去除默认的xmlns命名空间前缀

来源:AI智能体作者:沙月恵奈‌头衔:网络博主
导读:本期聚焦于小伙伴创作的《C# XmlSerializer序列化时如何去除默认的xmlns命名空间前缀》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《C# XmlSerializer序列化时如何去除默认的xmlns命名空间前缀》有用,将其分享出去将是对创作者最好的鼓励。

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

C# XmlSerializer序列化时如何去除默认的xmlns命名空间前缀

为什么会有默认的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

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。