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
相关产品推荐
相关产品推荐

