前言
在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是应用的血液 - 三者共同构建健壮的应用生态"