C#生成XML优化咨询:精简WinForm人员信息录入重复代码
优化方案:使用对象序列化替代手动节点创建
1. 定义对应XML结构的实体类
先创建共享的人员基类和具体子类,搭配XML特性标记匹配目标结构:
// 通用人员基类,包含重复属性 public class Person { public int Num { get; set; } public string Name { get; set; } public string Surname { get; set; } public string Rank { get; set; } } // 具体人员类型类,仅用于映射XML节点名称 public class Instructor : Person { } public class Student : Person { } public class Operator : Person { } public class Technician : Person { } // Flight根节点对应的实体类 public class Flight { public string Description { get; set; } public Instructor Instructor { get; set; } public Student Student { get; set; } public Operator Operator { get; set; } public Technician Technician { get; set; } }
2. 从WinForm控件填充实体对象
将文本框数据映射到实体,无重复逻辑:
// 实例化并填充Flight数据 var flight = new Flight { Description = txtFlightDesc.Text, Instructor = new Instructor { Num = int.Parse(txtInstructorNum.Text), Name = txtInstructorName.Text, Surname = txtInstructorSurname.Text, Rank = txtInstructorRank.Text }, Student = new Student { Num = int.Parse(txtStudentNum.Text), Name = txtStudentName.Text, Surname = txtStudentSurname.Text, Rank = txtStudentRank.Text }, Operator = new Operator { Num = int.Parse(txtOperatorNum.Text), Name = txtOperatorName.Text, Surname = txtOperatorSurname.Text, Rank = txtOperatorRank.Text }, Technician = new Technician { Num = int.Parse(txtTechnicianNum.Text), Name = txtTechnicianName.Text, Surname = txtTechnicianSurname.Text, Rank = txtTechnicianRank.Text } };
3. 序列化实体为XML
用XmlSerializer自动生成XML,彻底替代手动节点操作:
using System.Xml.Serialization; using System.IO; // 序列化核心逻辑 var serializer = new XmlSerializer(typeof(Flight)); using var writer = new StringWriter(); serializer.Serialize(writer, flight); // 获取最终XML字符串 string xmlResult = writer.ToString(); // 若需保存到文件,替换为FileStream即可 // using var fileStream = new FileStream("flight.xml", FileMode.Create); // serializer.Serialize(fileStream, flight);
优化优势
- 消除重复:无需为四类人员重复编写节点创建、赋值、拼接逻辑
- 类型安全:编译时即可检测属性赋值错误,避免手动拼接XML的字符串漏洞
- 易维护:修改XML结构仅需调整实体类特性或属性,无需改动大量节点操作代码
目标XML结构示例(序列化后生成)
<?xml version="1.0" encoding="utf-16"?> <Flight xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema"> <Description>北京-上海航线</Description> <Instructor> <Num>101</Num> <Name>张</Name> <Surname>三</Surname> <Rank>特级教员</Rank> </Instructor> <Student> <Num>201</Num> <Name>李</Name> <Surname>四</Surname> <Rank>学员</Rank> </Student> <Operator> <Num>301</Num> <Name>王</Name> <Surname>五</Surname> <Rank>运营主管</Rank> </Operator> <Technician> <Num>401</Num> <Name>赵</Name> <Surname>六</Surname> <Rank>维修技师</Rank> </Technician> </Flight>
自定义XML结构补充
如果需要调整节点名称、属性映射或命名空间,可通过XML特性修改实体类,例如:
public class Person { [XmlAttribute] // 将Num设为节点属性而非子元素 public int Num { get; set; } [XmlElement("FullName")] // 自定义Name节点的显示名称 public string Name { get; set; } public string Surname { get; set; } public string Rank { get; set; } }
内容的提问来源于stack exchange,提问作者mert
相关产品推荐
相关产品推荐

