C# XML 序列化与XML节点解析全套笔记

一、XML 基础概念

XML :可扩展标记语言,由成对标签组成,用于存储、传输结构化数据。

弥补 HTML 只能展示数据、不能存储结构化数据的缺陷。

XML结构组成:根节点、子节点、标签名、标签文本(InnerText)

必备命名空间:using System.Xml;


二、C# 操作XML的两大核心类

类名 作用 适用场景
XmlSerializer 快速对象 <=> XML 文件(全自动序列化) 简单对象快速存读,无需手动解析节点
XmlDocument DOM文档对象模型,手动加载、遍历、解析节点 复杂XML、自定义解析、过滤节点、读取不规则XML

三、XmlSerializer 快速序列化/反序列化(极简)

1. 实体类

cs 复制代码
public class People
{
    public string Name { get; set; }
    public int Age { get; set; }
}

2. 对象序列化为 XML 文件

对象 → 自动生成规范XML文档

cs 复制代码
// 1. 创建对象
People p = new People() { Age = 10, Name = "zs" };

// 2. 创建文件流
FileStream fs = new FileStream(@"1.xml", FileMode.Create);

// 3. 序列化工具绑定实体类型
XmlSerializer xml = new XmlSerializer(typeof(People));

// 4. 执行序列化写入
xml.Serialize(fs, p);

// 5. 释放资源
fs.Close();
fs.Dispose();

3. XML 文件反序列化为对象

本地XML → 还原为C#对象

cs 复制代码
FileStream fs = new FileStream(@"1.xml", FileMode.Open);
XmlSerializer xml = new XmlSerializer(typeof(People));

// 强制转换还原对象
People p1 = (People)xml.Deserialize(fs);  

this.Text = p1.Name;

fs.Close();
fs.Dispose();

特点

  • 无需写特性、无需拼接标签,全自动生成XML格式

  • 读写速度快,适合标准实体类数据存储


四、标准XML数据源(课程案例XML)

结构:根节点 StudentList,多个子节点 Student,包含姓名、年龄、性别、电话

cs 复制代码
<?xml version="1.0" encoding="utf-8" ?>
<StudentList>
  Student>
    ame>张三1</Name>
  <Age>10</Age>
      >男</Sex>
    hone>121323232</Phone>
    tudent>
 <Student>
    ame>张三2</Name>
  <Age>10</Age>
   Sex>男</Sex>
     one>121323232</Phone>
    tudent>
 <Student>
  <Name>张三3</Name>
    ge>10</Age>
   Sex>男</Sex>
   Phone>121323232</Phone>
  /Student>
  Student>
  <Name>张三4</Name>
    ge>10</Age>
   Sex>男</Sex>
  <Phone>121323232</Phone>
   Student>
 <a>asasa</a>
</StudentList>            </                           <            <A                    <      <      <                    <            <A                         </S    <Ph             <                          <N                  </S            <P   <Sex                          <N             <

五、XmlDocument 手动节点解析(重难点)

1. 对应实体类

cs 复制代码
public class Student
{
    public string Name { get; set; }
    public int Age { get; set; }
    public string Sex { get; set; }
    public string Phone { get; set; }
}

2. 完整解析源码(逐节点遍历)

cs 复制代码
private void button1_Click(object sender, EventArgs e)
{
    List<Student> list = new List<Student>();

    // 1. 实例化XML文档对象
    XmlDocument document = new XmlDocument();

    // 2. 加载XML文件
    document.Load(@"../../XMLFile1.xml");

    // 3. 获取文档根节点 <StudentList>
    XmlNode root = document.DocumentElement;

    // 4. 遍历根节点所有一级子节点
    foreach (XmlNode node in root.ChildNodes)
    {
        // 只解析 Student 节点,过滤其他杂节点(如<a>)
        if (node.Name == "Student")
        {
            Student stu = new Student();

            // 5. 遍历 Student 内部子节点(Name/Age/Sex/Phone)
            foreach (XmlNode node1 in node.ChildNodes)
            {
                switch (node1.Name)
                {
                    case "Name":
                        stu.Name = node1.InnerText;
                        break;
                    case "Age":
                        stu.Age = int.Parse(node1.InnerText);
                        break;
                    case "Sex":
                        stu.Sex = node1.InnerText;
                        break;
                    case "Phone":
                        stu.Phone = node1.InnerText;
                        break;
                }
            }

            // 封装到集合
            list.Add(stu);
        }
    }

    // 遍历展示所有学生姓名
    foreach (var item in list)
    {
        MessageBox.Show(item.Name);
    }
}

六、核心对象与属性详解

  • XmlDocument:XML文档核心操作对象

  • document.Load(路径):加载本地XML文件

  • DocumentElement:获取根节点

  • ChildNodes:获取当前节点的所有直接子节点集合

  • node.Name:获取标签名(Name、Age、Sex...)

  • node.InnerText:获取标签内部文本内容

七、关键逻辑亮点

  • 自动过滤无效节点 :判断 node.Name == "Student",自动过滤XML中多余的 <a> 杂节点

  • 双层循环解析:外层遍历学生对象,内层遍历学生字段

  • 类型转换 :XML文本都是字符串,数字字段必须手动 int.Parse


八、三种序列化对比(IO终极总结)

序列化方式 格式 特点
二进制 Binary 二进制乱码 体积最小、安全性高、需 Serializable
JSON 键值对明文 前后端通用、极简、项目最常用
XML 标签嵌套明文 老式项目、配置文件常用、结构严谨

九、高频易错点

  • XML所有数据都是字符串,数字类型必须手动转换

  • XML文档存在多余杂节点,必须通过节点名过滤,否则报错

  • XmlSerializer 不需要序列化特性,和二进制完全不同

  • 路径问题:../../ 代表返回上一级目录,适配项目资源文件

  • InnerText 获取文本,切勿和 OuterXml、InnerXml 混淆


十、背诵口诀

XML成对标签行,根节点下子节点藏;

XmlSerializer全自动,对象转标存本地;

XmlDocument手动解,双层循环取字段;

过滤杂项转类型,结构化数据稳如山。