Unity数据持久化 之 Xml入门精要 (从语法入门到序列与反序列化)

该教程资源来源于唐老狮,仅作学习分享交流

学习xml是因为看到了uitookit里出现了uxml 所以来学习一下

1.xml结构

2.基础语法

注释与开头固定写法

XML 复制代码
<!--第1行 注释格式  第2行代表版本和编码格式,是固定写法-->
<?xml version="1.0" encoding="UTF-8"?>

变量与树形结构

节点需要一对对存在<>和</>是一对 相当于c#中的 { 和 }是一对,**这一对就叫做元素,**一般对应c#中的字段

XML 复制代码
<!-- 根节点与其下的数据 -->
<根节点> 
	<子节点1>
		<数据> 123 </数据>
			<数据下的数据>456</数据下的数据>
	</子节点1>
</根节点>

根节点

└── 子节点1

├── 数据

│ └── 123

└── 数据下的数据

└── 456

属性

每个节点可以有其自己的属性,**元素也可以改为属性,**一般对应c#中的属性

节点名后面+空格 +属性名 = "数据"

XML 复制代码
<!-- 根节点与其下的数据 -->
<根节点> 
	<子节点1>
		<数据> 123 </数据>
			<数据下的数据>456</数据下的数据>
	</子节点1>
</根节点>
XML 复制代码
<!-- 属性-->
<节点1 数据 ="123">数据内容</节点1>

根节点

└── 节点1

├── 属性: 数据 = "123"

└── 内容: 数据内容

可以没有内容,就会变成下面这样

XML 复制代码
<节点1 数据 ="123"/>

节点1

└── 属性: 数据 = "123"

注意规则

3.练习翻译

下面是一个c#的类 那些特性只是提醒给你变量类型的,试试手写将其反序列化为xml吧

cs 复制代码
[XmlRoot("公司")]
public class 公司
{
    [XmlElement("公司名称")]
    public string 公司名称 { get; set; }

    [XmlElement("员工")]
    public List<员工> 员工列表 { get; set; }
}

public class 员工
{
    [XmlAttribute("ID")]
    public int ID { get; set; }

    [XmlElement("姓名")]
    public string 姓名 { get; set; }

    [XmlElement("职位")]
    public string 职位 { get; set; }
}

答案

XML 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<公司>
	<公司名称>任意名称</公司名称>
	<员工 ID="1" 姓名="张三" 职位="做unity的"/>
	<员工 ID="2" 姓名="李四" 职位="做美术的"/>
	<!-- 非属性来写一个员工的话 -->
	<员工>
		<ID>3</ID>
		<姓名>王五</姓名>
		<职位>做策划的</职位>
	</员工>
</公司>

4.通过代码获取和修改xml

cs 复制代码
using System;
using System.Xml;

class Program
{
    static void Main()
    {
        // 加载 XML 文件
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.Load("example.xml");

        // 查找要修改的节点
        XmlNode employeeNode = xmlDoc.SelectSingleNode("/公司/员工[@ID='1']/职位");

        if (employeeNode != null)
        {
            // 修改节点的值
            employeeNode.InnerText = "做策划的";

            // 保存更改
            xmlDoc.Save("example.xml");
            Console.WriteLine("XML 文件已更新。");
        }
        else
        {
            Console.WriteLine("未找到指定的节点。");
        }
    }
}

5.序列化与反序列化

序列化就是将c#文件转为xml ,xml是有序的 所以叫序列化

比如我有一个Person类 包含两个属性

cs 复制代码
[Serializable]
public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
}

用到using System.Xml.Serialization下的XmlSerializer 类

StreamWriter 和 StreamReader用于文件的读写操作

你当然可以在unity中用StreamingAsset中的类也是可以的

cs 复制代码
using System;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main()
    {
        // 创建一个对象实例
        Person person = new Person { Name = "John Doe", Age = 30 };

        // 创建 XmlSerializer 实例
        XmlSerializer serializer = new XmlSerializer(typeof(Person));

        // 序列化对象并写入 XML 文件
        using (StreamWriter writer = new StreamWriter("person.xml"))
        {
            serializer.Serialize(writer, person);
        }

        Console.WriteLine("对象已序列化到 XML 文件。");
    }
}

反序列化

cs 复制代码
using System;
using System.IO;
using System.Xml.Serialization;

class Program
{
    static void Main()
    {
        // 创建 XmlSerializer 实例
        XmlSerializer serializer = new XmlSerializer(typeof(Person));

        // 从 XML 文件中读取数据并反序列化
        using (StreamReader reader = new StreamReader("person.xml"))
        {
            Person person = (Person)serializer.Deserialize(reader);
            Console.WriteLine($"Name: {person.Name}, Age: {person.Age}");
        }
    }
}
相关推荐
samble5 小时前
从零搭建灌装监控系统(十):生产追溯,条码触发自动记录
c#·wpf·mvvm·modbus·工业控制
WarPigs8 小时前
Unity在Create菜单添加创建自定义脚本模板选项
unity
czhc114007566310 小时前
退出防呆:用“总闸“收口所有退出入口,以及三个并发语法坑
开发语言·c#
淡海水12 小时前
02-01-原理篇-Mark-Sweep与变种算法
算法·unity·c#·游戏引擎·.net·gc
babywang013 小时前
Unity笔记--塔防游戏中的ECS架构:从原理到实战的全面解析
unity·ecs架构
UIU11416 小时前
同一个变量在两个 .c 文件里类型不一致,程序会怎样?
c++·学习·c#
波力海苔夹心脆6751 天前
C# 值类型与引用类型详解:存储位置、赋值机制、参数传递、相等比较、装箱拆箱与常见陷阱
开发语言·jvm·经验分享·笔记·c#·.net
估值探索者1 天前
【Python量化策略实战 #02】多因子合成mom和vol两因子打分合成
开发语言·c++·python·数据挖掘·c#
babywang02 天前
Unity笔记--AssetBundle详解
unity·游戏引擎
泡海椒2 天前
JQuick-Excel 字段映射实战:用 MAPPING 固化 Excel 表头与业务字段契约
xml·java·开发语言·excel