【C#学习Day16笔记】XML文件、 事件Event 、Json数据
前言
在C#第16天的学习中,我深入探索了XML数据处理、事件机制和JSON操作三大核心主题。这些技术是现代软件开发中数据交换和事件驱动编程的关键工具。本文完整保留我的课堂实践代码和命名体系,通过结构化梳理帮助大家掌握这些核心知识。所有代码示例均来自我的实际操作,包含从基础到进阶的完整学习过程!
一、XML数据处理:结构化数据存储
1. XML文档创建与写入
// 创建XML文档对象
XmlDocument xml = new XmlDocument();// 添加XML声明
XmlDeclaration dcl = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
xml.AppendChild(dcl);// 创建根节点
XmlElement root = xml.CreateElement("root");
xml.AppendChild(root);// 添加子节点
XmlElement nameElement = xml.CreateElement("name");
nameElement.InnerText = "张三";
nameElement.SetAttribute("id", "123456"); // 设置属性
root.AppendChild(nameElement);XmlElement ageElement = xml.CreateElement("Age");
ageElement.InnerText = "18";
root.AppendChild(ageElement);// 保存到文件
xml.Save("student.xml");
Console.WriteLine("XML文件写入成功");
2. XML文档读取与解析
XmlDocument doc = new XmlDocument();
doc.Load("student.xml");// 获取根节点
XmlNode rootNode = doc.DocumentElement;
Console.WriteLine($"根节点名称: {rootNode.Name}");// 遍历子节点
foreach (XmlNode node in rootNode.ChildNodes)
{Console.WriteLine($"节点名称: {node.Name}");Console.WriteLine($"节点内容: {node.InnerText}");// 检查特定内容if (node.InnerText == "张三"){Console.WriteLine("找到张三的记录");}// 获取属性值if (node.Attributes != null){foreach (XmlAttribute attr in node.Attributes){Console.WriteLine($"属性: {attr.Name}={attr.Value}");}}
}
3. XML核心应用场景
应用场景 | 优势 | 代码实现 |
---|---|---|
配置文件 | 结构化存储配置项 | App.config |
数据交换 | 跨平台数据格式 | Web服务通信 |
数据存储 | 层次化数据存储 | 替代简单数据库 |
二、事件机制:委托与事件驱动编程
1. 事件基础实现
// 工具人类(事件发布者)
internal class ToolMan
{public string Name { get; set; }// 定义委托类型public delegate void DownDelegate();// 定义事件(基于委托)public event DownDelegate downDelegate = null;public ToolMan(string name){Name = name;}// 触发事件的方法public void Down(){Console.WriteLine($"{Name}下楼了");downDelegate?.Invoke(); // 安全调用}
}// 懒人类(事件订阅者)
internal class LazyMan
{public string Name { get; set; }public LazyMan(string name){Name = name;}public void TakeFood(){Console.WriteLine($"帮{Name}买饭");}public void GetFoot(){Console.WriteLine($"帮{Name}拿快递");}
}// 使用示例
ToolMan toolMan = new ToolMan("工具人");
LazyMan lazyMan1 = new LazyMan("小明");
LazyMan lazyMan2 = new LazyMan("小红");// 订阅事件
toolMan.downDelegate += lazyMan1.TakeFood;
toolMan.downDelegate += lazyMan2.GetFoot;// 触发事件
toolMan.Down();
2. 带参数的事件
// 带参数的事件定义
public event Action<string> action;// 事件触发
public void PerformAction()
{action?.Invoke("事件参数值");
}// 事件订阅
toolMan.action += (message) =>
{Console.WriteLine($"收到消息: {message}");
};
3. 热水器报警系统案例
// 热水器类(事件发布者)
internal class Heater
{public event Action<int> OverheatAlert;public void BoilWater(){for (int i = 0; i <= 100; i++){if (i >= 95){OverheatAlert?.Invoke(i); // 触发事件}}}
}// 报警器类(事件订阅者)
internal class Alarm
{public void ShowMsg(int temperature){Console.WriteLine($"警报!水温过高: {temperature}°C");}
}// 显示屏类(事件订阅者)
internal class Display
{public void UpdateDisplay(int temperature){Console.WriteLine($"当前水温: {temperature}°C - 即将沸腾!");}
}// 使用示例
Heater heater = new Heater();
Alarm alarm = new Alarm();
Display display = new Display();// 订阅事件
heater.OverheatAlert += alarm.ShowMsg;
heater.OverheatAlert += display.UpdateDisplay;// 开始加热
heater.BoilWater();
4. 事件机制核心要点
概念 | 说明 | 代码体现 |
---|---|---|
委托 | 方法的类型 | public delegate void DownDelegate() |
事件 | 特殊的委托 | public event DownDelegate downDelegate |
发布者 | 触发事件的对象 | ToolMan 类 |
订阅者 | 响应事件的对象 | LazyMan 类 |
事件参数 | 传递事件数据 | Action<int> |
三、JSON数据处理:现代数据交换格式
1. JSON序列化与反序列化
// 学生类定义
internal class Student
{public string Name { get; set; }public int Id { get; set; }public bool Sex { get; set; }public string Address { get; set; }public Student(string name, int id, bool sex, string address){Name = name;Id = id;Sex = sex;Address = address;}
}// 序列化对象→JSON
Student stu = new Student("张三", 1001, true, "北京市海淀区");
string json = JsonConvert.SerializeObject(stu);
Console.WriteLine(json);
// 输出: {"Name":"张三","Id":1001,"Sex":true,"Address":"北京市海淀区"}// 反序列化JSON→对象
Student deserialized = JsonConvert.DeserializeObject<Student>(json);
Console.WriteLine($"姓名: {deserialized.Name}, ID: {deserialized.Id}");
2. 动态创建JSON
// 创建JSON对象
JObject jsonObj = new JObject();// 添加属性
jsonObj["name"] = "李四";
jsonObj["age"] = 25;// 添加数组
JArray colors = new JArray();
colors.Add("红色");
colors.Add("蓝色");
colors.Add("绿色");
jsonObj["favoriteColors"] = colors;// 转换为字符串
string jsonString = jsonObj.ToString();
Console.WriteLine(jsonString);
3. JSON文件读写
// 写入JSON文件
string path = "data.json";
using (StreamWriter sw = new StreamWriter(path))
{sw.WriteLine(jsonString);
}// 读取JSON文件
using (StreamReader sr = new StreamReader(path))
{string jsonContent = sr.ReadToEnd();JObject parsedJson = JObject.Parse(jsonContent);// 访问数据Console.WriteLine($"姓名: {parsedJson["name"]}");Console.WriteLine($"年龄: {parsedJson["age"]}");// 遍历数组foreach (string color in parsedJson["favoriteColors"]){Console.WriteLine($"喜欢的颜色: {color}");}
}
4. JSON应用场景对比
场景 | XML | JSON |
---|---|---|
数据体积 | 较大(标签冗余) | 较小(简洁格式) |
可读性 | 结构化好 | 简洁易读 |
解析难度 | 复杂(需DOM解析) | 简单(直接反序列化) |
适用场景 | 文档型数据 | API数据交换 |
四、综合案例:学生管理系统
1. 数据模型设计
public class Student
{public string Name { get; set; }public int Id { get; set; }public int Age { get; set; }public string Major { get; set; }
}public class Course
{public string Name { get; set; }public string Teacher { get; set; }
}
2. 事件驱动设计
public class StudentManager
{// 定义事件public event Action<Student> StudentAdded;public event Action<Student> StudentUpdated;private List<Student> students = new List<Student>();public void AddStudent(Student student){students.Add(student);StudentAdded?.Invoke(student);}public void UpdateStudent(int id, Student newData){Student target = students.Find(s => s.Id == id);if (target != null){target.Name = newData.Name;target.Age = newData.Age;target.Major = newData.Major;StudentUpdated?.Invoke(target);}}
}
3. JSON持久化实现
public class DataService
{public void SaveStudents(List<Student> students, string path){string json = JsonConvert.SerializeObject(students, Formatting.Indented);File.WriteAllText(path, json);}public List<Student> LoadStudents(string path){if (File.Exists(path)){string json = File.ReadAllText(path);return JsonConvert.DeserializeObject<List<Student>>(json);}return new List<Student>();}
}
4. XML配置管理
public class ConfigManager
{public string ConfigPath { get; }public ConfigManager(string path){ConfigPath = path;}public void SaveConfig(Dictionary<string, string> settings){XmlDocument doc = new XmlDocument();XmlElement root = doc.CreateElement("Configuration");doc.AppendChild(root);foreach (var setting in settings){XmlElement element = doc.CreateElement(setting.Key);element.InnerText = setting.Value;root.AppendChild(element);}doc.Save(ConfigPath);}public Dictionary<string, string> LoadConfig(){var settings = new Dictionary<string, string>();XmlDocument doc = new XmlDocument();doc.Load(ConfigPath);foreach (XmlNode node in doc.DocumentElement.ChildNodes){settings[node.Name] = node.InnerText;}return settings;}
}
学习总结与进阶建议
核心知识图谱
关键技术对比
技术 | 核心优势 | 典型应用 |
---|---|---|
XML | 结构化、可验证 | 配置文件、SOAP协议 |
事件 | 解耦、响应式 | GUI编程、异步通知 |
JSON | 轻量、易解析 | RESTful API、移动应用 |
最佳实践指南
XML使用场景:
- 需要严格数据验证时
- 文档型数据结构
- 遗留系统集成
事件设计原则:
- 使用
event
关键字确保封装性 - 遵循
发布者-订阅者
模式 - 使用
?.Invoke()
安全触发事件
- 使用
JSON处理技巧:
- 使用
JsonConvert
简化序列化 - 使用
JObject
处理动态JSON - 使用
Formatting.Indented
美化输出
- 使用
进阶学习路径
XML高级:
- XPath查询
- XML Schema验证
- XSLT转换
事件深入:
- 异步事件处理
- 弱事件模式
- 事件聚合器
JSON扩展:
- JSON Schema验证
- JSON Patch操作
- JSON Web Tokens(JWT)
编程箴言
"XML是数据的骨架,事件是系统的神经,JSON是应用的血液 - 三者共同构建健壮的应用生态"