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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.20 19:36:32