当前位置: 首页 > news >正文

【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应用场景对比

场景XMLJSON
数据体积较大(标签冗余)较小(简洁格式)
可读性结构化好简洁易读
解析难度复杂(需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、移动应用

最佳实践指南

  1. XML使用场景​:

    • 需要严格数据验证时
    • 文档型数据结构
    • 遗留系统集成
  2. 事件设计原则​:

    • 使用event关键字确保封装性
    • 遵循发布者-订阅者模式
    • 使用?.Invoke()安全触发事件
  3. JSON处理技巧​:

    • 使用JsonConvert简化序列化
    • 使用JObject处理动态JSON
    • 使用Formatting.Indented美化输出

进阶学习路径

  1. XML高级​:

    • XPath查询
    • XML Schema验证
    • XSLT转换
  2. 事件深入​:

    • 异步事件处理
    • 弱事件模式
    • 事件聚合器
  3. JSON扩展​:

    • JSON Schema验证
    • JSON Patch操作
    • JSON Web Tokens(JWT)

编程箴言
"XML是数据的骨架,事件是系统的神经,JSON是应用的血液 - 三者共同构建健壮的应用生态"

http://www.dtcms.com/a/309591.html

相关文章:

  • Sqlserver备份恢复指南-完整备份恢复
  • 从零到英雄:掌握神经网络的完整指南
  • Qt Quick 自定义组件开发
  • 江协科技STM32 11-4 SPI通信外设
  • Android SDK 版本差异与兼容方案:从适配到实践
  • gitlab 开发人员无法创建分支,管理员配置分支权限
  • flutter-boilerplate-project 学习笔记
  • 嵌入式学习笔记-MCU阶段--DAY09
  • STM32-ESP8266Wi-Fi模块使用USART实现通信/创建AP和STA模式配置教程(寄存器版)
  • 从0开始学习R语言--Day64--决策树回归
  • 流式编程的中间操作
  • 机器学习sklearn:随机森林的决策树
  • 低通滤波器的原理以及作用
  • C# 引用外部项目
  • 切比雪夫不等式
  • 网页从点击到显示:前端开发视角下的旅程
  • 在SQL SERVER 中如何用脚本实现每日自动调用存储过程
  • 大模型开发框架LangChain之构建知识库
  • 高速公路桥梁安全监测系统解决方案
  • 技术栈:基于Java语言的搭子_搭子社交_圈子_圈子社交_搭子小程序_搭子APP平台
  • 安全专家发现利用多层跳转技术窃取Microsoft 365登录凭证的新型钓鱼攻击
  • 【C#学习Day14笔记】泛型、集合(数组列表Arraylist、列表list)与字典
  • Python 中的可迭代、迭代器与生成器——从协议到实现再到最佳实践
  • 最新docker国内镜像源地址大全
  • AttributeError: ChatGLMTokenizer has no attribute vocab_size
  • 强反光干扰下识别率↑89%!陌讯多模态融合算法在烟草SKU识别的实战解析
  • MySQL分析步
  • U-Net vs. 传统CNN:为什么医学图像分割需要跳过连接?
  • C语言的复合类型、内存管理、综合案例
  • 【AI 加持下的 Python 编程实战 2_12】第九章:繁琐任务的自动化(上)——自动清理电子邮件文本