You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#动态XML序列化:xsd.exe生成类后如何序列化回XML并保留原结构?

用xsd.exe生成的类序列化回XML并保留原结构的方法

直接用.NET自带的XmlSerializer就能搞定这件事——毕竟xsd.exe生成的类已经自带了序列化所需的特性标签(比如[XmlRoot]、[XmlElement]),只要按步骤来,就能完美匹配原XSD定义的结构:

基础序列化步骤

  • 先实例化xsd.exe生成的根类对象,把要填充的数据赋值进去
  • 创建XmlSerializer实例,传入根类的类型即可(如果原XSD有命名空间,生成的类的XmlRoot属性里已经包含,序列化时会自动带上)
  • 用XmlWriter或StreamWriter把对象序列化成XML,推荐用XmlWriterSettings配置缩进、编码,让输出的XML更规范易读

代码示例

假设你用xsd.exe生成的根类叫OrderRoot,代码参考如下:

// 1. 给生成的类对象填充数据
var order = new OrderRoot
{
    OrderId = "ORD-001",
    Customer = new Customer
    {
        Name = "张三",
        Email = "zhangsan@example.com"
    },
    Items = new List<OrderItem>
    {
        new OrderItem { ProductId = "PROD-001", Quantity = 2 },
        new OrderItem { ProductId = "PROD-002", Quantity = 1 }
    }
};

// 2. 配置XML输出格式(可选,让结构更清晰)
var settings = new XmlWriterSettings
{
    Indent = true,
    Encoding = Encoding.UTF8,
    OmitXmlDeclaration = false // 是否保留XML声明,根据原XSD需求调整
};

// 3. 执行序列化并写入文件
using (var writer = XmlWriter.Create("output.xml", settings))
{
    var serializer = new XmlSerializer(typeof(OrderRoot));
    serializer.Serialize(writer, order);
}

关键注意事项

  • 命名空间匹配:如果原XSD定义了目标命名空间,xsd.exe生成的类会带有[XmlRoot(Namespace = "你的命名空间")]这类特性,序列化时会自动把命名空间写入XML,无需额外配置
  • 可选元素处理:XSD里标记为可选的元素(minOccurs="0"),生成的类会对应可空属性,只要不赋值,序列化时就不会输出该元素,完全符合原结构要求
  • 集合/数组处理:xsd.exe生成的集合类(比如List<T>或自定义数组)会带有[XmlArray]/[XmlArrayItem]特性,序列化后会自动生成符合XSD结构的嵌套元素

验证序列化结果

要是担心生成的XML不符合原XSD,可以用这段代码验证:

var schemaSet = new XmlSchemaSet();
schemaSet.Add(null, "你的原XSD文件路径");

var reader = XmlReader.Create("output.xml");
var validationErrors = new List<string>();
reader.Settings.ValidationType = ValidationType.Schema;
reader.Settings.Schemas = schemaSet;
reader.Settings.ValidationEventHandler += (sender, e) => validationErrors.Add(e.Message);

while (reader.Read()) { }

if (validationErrors.Count == 0)
{
    Console.WriteLine("XML完全符合原XSD结构");
}
else
{
    Console.WriteLine("XML不符合原XSD,错误信息:");
    foreach (var error in validationErrors)
    {
        Console.WriteLine(error);
    }
}

内容的提问来源于stack exchange,提问作者Ariox66

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 19:55:15