IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> Unity数据持久化——XML -> 正文阅读

[游戏开发]Unity数据持久化——XML

1.XML概述

1.XML是什么?

全称:可拓展标记语言(EXtensible Markup Language)

XML是国际通用的

它是被设计来用于传输和存储数据的一种文本特殊格式

文件后缀一般为.xml

2.如何理解不同后缀的文件

文件后缀名决定了文件的格式

不同的软件可以根据后缀名用来判断文件的类型,并且在打开文件时以特定的读取规则去解析它

文件后缀名是人为定的规则,可以有无数种,可以自定义

3.我们一般使用XML文件来记录和传输数据

XML文档就是使用XML格式配置填写的文档后缀一般为.xml

我们在游戏中可以把游戏数据按照XML的格式标准,存储在XML文档中,再将XML文档存储在硬盘上或者传输给远端,达到数据持久化的目的

2.XML文件格式

1.XML基本语法

只要能打开文档的软件都能打开 XML 文件,常用的一些打开 XML 文件的方式 :

  1. 系统自带——记事本、写字板
  2. 专用 XML 文本编辑器——XMLSpear、STDU XML Editor 等等
  3. 通用文本编辑器——Sublime Text 等等
  4. VS Code

XML 格式是一种树形结构的根结点

1.创建XML

直接右键创建文本,后缀改为.xml,选择自己喜欢的用于编辑 xml 的软件,进行文本编辑

2.语法规则

1.注释

<!-->
<!--在其中写明注释内容-->

2.开头

<!--固定内容,代表 xml 的版本以及使用的编码-->
<?xml version="1.0" encoding="UTF-8"?>

?3.内容

<!--xml 的基本语法就是 <元素标签> </元素标签> 配对出现-->
<PlayerInfo>
	<name>xxx</name>
	<age>18</age>
    <sex>true</sex>
	<listInt>
		<int>1</int>
		<int>2</int>
		<int>3</int>
	</listInt>
</PlayerInfo>

?4.基本规则

  • 每个元素都必须有关闭标签
  • 元素命名规则基本遵照 C# 中变量名命名规则
  • XML 标签对大小写敏感
  • XML 文档必须有根元素
  • 特殊的符号应该用实体引用

????????&lt? ? ? ? ——>? ? ?< (小于)

????????&gt? ? ? ?——>? ? ?> (大于)
????????&amp? ?——>? ? ?&(和号)
????????&apos? ——>? ? ? ' (单引号)
????????&quot? ?——>? ? ?" (引号)

3.XML属性

1.属性语法

属性就是在元素标签后面的空格添加的内容

注意:属性必须引用引号包裹 可以是单引号,也可以是双引号

<Friend name="xxx" age='18'>friend</Friend>

?如果使用属性记录信息,不想使用元素记录信息,就可以不写元素

<Friend name="xxx">

2.属性和元素结点的区别

? 属性和元素节点只是写法上的区别而已,我们可以选择自己喜欢的方式来记录数据

3.如何检查语法错误

  • 元素标签必须配对
  • 属性必须有引号
  • 注意命名

3.C#读取存储XML

1.XML文件存放位置

1.只读不写的 XML

放在 Resouces 或者 StreamingAssets(路径获取:Application.streamingAssetsPath) 文件夹下

2.动态存储的 XML

放在 Application.persistentDataPath 路径下

2.读取XML文件

C# 读取 XML 的方法有几种:

  1. XmlDocument (把数据加载到内存中,方便读取)
  2. XmlTextReader (以流形式加载,内存占用更少,但是是单向只读,使用不是特别方便,除非有特殊需求,否则不会使用)
  3. Linq

使用 XmlDocument 类读取是较方便最容易理解和操作的方法

示例:XML文件

<?xml version="1.0" encoding="UTF-8"?>
<!--TestXML.xml-->
<Root>
   <name>xxx</name>
   <age>18</age>
   <Item id="1" num="10"/>
   <Friend>
      <name>张三</name>
      <age>19</age>
   </Friend>
   <Friend>
      <name>李四</name>
      <age>20</age>
   </Friend>
</Root>

?1.读取 xml 文件信息

XmlDocument xml = new XmlDocument();

读取文本方式1
xml.LoadXml(传入xml文本字符串)

读取文本方式2
xml.Load(传入路径)
using System.Xml;

XmlDocument xml = new XmlDocument();
// 通过XmlDocument读取xml文件 有两个API


// 1.直接根据xml字符串内容 来加载xml文件
// 存放在Resorces文件夹下的xml文件加载处理
TextAsset asset = Resources.Load<TextAsset>("TestXml");
print(asset.text);
// 通过这个方法 就能够翻译字符串为xml对象
xml.LoadXml(asset.text);


// 2.是通过xml文件的路径去进行加载
// 存放在StreamingAssets文件夹下的xml文件加载处理
xml.Load(Application.streamingAssetsPath + "/TestXml.xml");

2.读取元素和属性信息?

节点信息类:XmlNode 单个节点信息类

节点列表信息:XmlNodeList 多个节点信息类?

获取单个节点:
XmlNode node = xml.SelectSingleNode(节点名);
获取多个节点:
XmlNodeList nodeList = xml.SelectNodes(节点名);

获取节点元素内容:node.InnerText
获取节点元素属性:
    1.item.Attributes["属性名"].Value;
    2.item.Attributes.GetNamedItem("属性名").Value;

通过迭代器遍历或者循环遍历XmlNodeList对象 可以获取到各单个元素节点
// 获取xml当中的根节点
XmlNode root = xml.SelectSingleNode("Root");
// 再通过根节点 去获取下面的子节点
XmlNode nodeName = root.SelectSingleNode("name");
// 如果想要获取节点包裹的元素信息 直接 .InnerText
print(nodeName.InnerText);

XmlNode nodeAge = root.SelectSingleNode("age");
print(nodeAge.InnerText);

XmlNode nodeItem = root.SelectSingleNode("Item");
// 第一种方式 直接 中括号获取信息 
print(nodeItem.Attributes["id"].Value);
print(nodeItem.Attributes["num"].Value);
// 第二种方式 
print(nodeItem.Attributes.GetNamedItem("id").Value);
print(nodeItem.Attributes.GetNamedItem("num").Value);

// 这里是获取 一个节点下的同名节点的方法
XmlNodeList friendList = root.SelectNodes("Friend");

// 遍历方式一:迭代器遍历
foreach (XmlNode item in friendList)
{
    print(item.SelectSingleNode("name").InnerText);
    print(item.SelectSingleNode("age").InnerText);
}

// 遍历方式二:通过for循环遍历
// 通过XmlNodeList中的 成员变量 Count可以得到 节点数量
for (int i = 0; i < friendList.Count; i++)
{
    print(friendList[i].SelectSingleNode("name").InnerText);
    print(friendList[i].SelectSingleNode("age").InnerText);
}

3.存储修改XML文件

1.决定存储在哪个文件夹下

?存储 xml 文件,在 Unity 中一定是使用各平台都可读可写可找到的路径

Application.persistentDataPath

2.存储 XML 文件

关键类 XmlDocument:用于创建节点 存储文件

关键类 XmlDeclaration:用于添加版本信息

关键类 XmlElement:节点类

存储有 5 步:

第一步:创建文本对象

XmlDocument xml = new XmlDocument();

第二步:添加固定版本信息

// 这一句代码 相当于就是创建<?xml version="1.0" encoding="UTF-8"?>这句内容
// 第三个参数传空串就可以了,目前不用管
XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
// 创建完成过后 要添加进入 文本对象中
xml.AppendChild(xmlDec);

第三步:添加根节点

XmlElement root = xml.CreateElement("Root");
xml.AppendChild(root);

第四步:为根节点添加子节点

// 加了一个 name子节点
XmlElement name = xml.CreateElement("name");
name.InnerText = "xxx";
root.AppendChild(name);

XmlElement atk = xml.CreateElement("atk");
atk.InnerText = "10";
root.AppendChild(atk);

XmlElement listInt = xml.CreateElement("listInt");
for (int i = 1; i <= 3; i++)
{
    XmlElement childNode = xml.CreateElement("int");
    childNode.InnerText = i.ToString();
    listInt.AppendChild(childNode);
}
root.AppendChild(listInt);

XmlElement itemList = xml.CreateElement("itemList");
for (int i = 1; i <= 3; i++)
{
    XmlElement childNode = xml.CreateElement("Item");
    // 添加属性
    childNode.SetAttribute("id", i.ToString());
    childNode.SetAttribute("num", (i * 10).ToString());
    itemList.AppendChild(childNode);
}
root.AppendChild(itemList);

第五步:保存

xml.Save(path);

3.修改 XML 文件?

using System.IO;

// 1.先判断是否存在文件
if( File.Exists(path) )
{
    // 2.加载后 直接添加节点 移除节点即可
    XmlDocument newXml = new XmlDocument();
    newXml.Load(path);

    // 修改就是在原有文件基础上 去移除 或者添加
    // 移除
    // 这种是一种简便写法 通过 "/" 来区分父子关系
    XmlNode node = newXml.SelectSingleNode("Root/atk");
    // XmlNode node = newXml.SelectSingleNode("Root").SelectSingleNode("atk");
    // 得到自己的父节点
    XmlNode root2 = newXml.SelectSingleNode("Root");
    // 移除子节点方法
    root2.RemoveChild(node);
    // 直接删除自己
    // node.ParentNode.RemoveChild(node);

    // 添加节点
    XmlElement speed = newXml.CreateElement("moveSpeed");
    speed.InnerText = "20";
    root2.AppendChild(speed);

    // 改了记得存
    newXml.Save(path);
}
  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-09-24 21:25:15  更:2022-09-24 21:25:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 3:59:12-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码