一、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手动解,双层循环取字段;
过滤杂项转类型,结构化数据稳如山。