【C#学习Day16笔记】XML文件、 事件Event 、Json数据

发布于:2025-08-02 ⋅ 阅读:(19) ⋅ 点赞:(0)

前言

在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、移动应用

最佳实践指南

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