👨💻个人主页:@元宇宙-秩沅
👨💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅!
👨💻 本文由 秩沅 原创
👨💻 收录于专栏:Unity基础实战
⭐🅰️⭐文章目录 ⭐🅰️⭐⭐前言⭐XML是什么和游戏存储的关系 🎶(==A==) XML文件格式 🎶(==B==) XML基本规则🎶(==C==) XML属性🎶(==D==) 读取XML文件(c#)🎶(==E==) 读取XML文件中的信息(c#)🎶(==F==) 存储XML文件中的信息(c#)🎶(==G==) 修改XML文件中的信息(c#)🎶(==s==) XML 练习XML编写练习读取练习存取练习 ⭐🅰️⭐
⭐前言⭐ XML是什么
XML(Extensible Markup Language)是一种类似于 HTML,但是没有使用预定义标记的语言。因此,可以根据自己的设计需求定义专属的标记。这是一种强大将数据存储在一个可以存储、搜索和共享的格式中的方法。最重要的是,因为 XML 的基本格式是标准化的,如果你在本地或互联网上跨系统或平台共享或传输 XML,由于标准化的 XML 语法,接收者仍然可以解析数据。
全称可拓展标记语言extentsible markup languageXML是国际通用的它是被设计用来传输和存储数据的一种文本特殊格式 和游戏存储的关系 游戏数据按照XML的格式标准——>存储在XML文档中再将XML文档存储在硬盘上或者传输给远端——达到数据持久化一种存储和传输数据的选择 一种配置数据的方法
🎶(A) XML文件格式
特点: 是一种树形结构
注释的格式:——!–在这里写注释–_________
固定的格式——?xml version =“1.0” encoding = “UTF-8”? UTF - 8是什么意思 和ASCII码一样它也是一种编码格式只不过ASCII码是最原始的编码格式世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码.电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
🎶(B) XML基本规则
符号含义< — <小于> — >大于& — &和&apos — ’单引号" — "引号
注意:
1.每个元素都必须有关闭标签 2.元素命名规则基本遵照C#中变量名命名规则 3.XML标签要注意大小写 4.XML文档必须有根元素
🎶(C) XML属性
属性的特点
属性就是在元素标签后面空格 添加的内容 注意: 属性必须用引号包裹 单引号双引号都可以
属性写法
元素节点 —————————————> 属性作用都一样
格式验证方法
菜鸟教程XML 格式验证器
练习当出现没有变量名的数据时 就用变量类型名命名
🎶(D) 读取XML文件(c#)
Xml文件存放位置
1.只读不写的XML文件可以放在 Resources或者StreamingAssets 文件夹下
2.动态存储的XML文件放在 Application.persistentDataPath 路径下
C#读取XML的方法有3种
1.XmlDocument (把数据加载到内存中,使用XmlDocument类读取是较方便最容易理解和操作的方法)2.XmlTextReader (以流形式加载,内存占用更少,但是是单向只读,使用不是特别方便,除非有特殊需求,否则不会使用)3.LinqXmlDocument
XmlDocument xml = new XmlDocument();
1.xml文件名加载——存放在Resorces文件夹下的xml文件加载处理 //为TextAsset Resorces文件夹下的文本类TextAsset asset = Resources.Load<TextAsset>("xml文件名");print(asset.text);//加载为xml对象xml.LoadXml(asset.text); 2.通过xml文件的路径加载——存放在StreamingAssets 文件夹下的xml文件加载处理 xml.Load(Application.streamingAssetsPath + "/xml文件名.xml");//streamingAssetsPath 文件夹只读(移动端)pc(可读可写)注意: 为什么不读Resource文件夹的路径,因为打包后它被压缩了读不到
🎶(E) 读取XML文件中的信息(c#)
XmlDocument xml = new XmlDocument();
1.相关类:
XmlNode 单个节点信息类XmlNodeList 多个节点信息类 XmlDocument 用于创建节点 存储文件XmlDeclaration 用于添加版本信息XmlElement 节点类2.获取xml当中的根节点:
XmlNode root = xml.SelectSingleNode(“根节点名”);3.获取下面的子节点:
XmlNode nodeName = root.SelectSingleNode(“name”);4.获取节点包裹的元素信息
nodeName.InnerText5.获取节点属性信息
XmlNode nodeItem = root.SelectSingleNode(“Item”);①nodeItem.Attributes[“属性名”].Value②nodeItem.Attributes.GetNamedItem(“属性名”).Value6.获取 一个节点下的同名节点的方法
为什么会有同名? 因为当出现没有变量名的数据时 就用变量类型名命名
XmlNode nodeListInt = root.SelectSingleNode(“ListInt”);XmlNodeList intList = nodeListInt.SelectNodes(“int”);7.得到之后遍历
迭代器遍历 foreach (XmlNode node in intList )for循环遍历 for (int i = 0; i < intList .Count; i++)8.得到子节点的子节点
写法一 XmlNode node = Xml.SelectSingleNode(“Root”).SelectSingleNode(“name”);写法二 XmlNode node = Xml.SelectSingleNode(“Root/name”);🎶(F) 存储XML文件中的信息(c#)
特殊文件夹读写性回顾
1.Resources 可读 不可写 打包后找不到 2.Application.streamingAssetsPath 可读 PC端可写 找得到 3.Application.dataPath 打包后找不到 4.Application.persistentDataPath 可读可写找得到
存储xml文件 在Unity中一定是使用各平台都可读可写可找到的路径
1.相关类:
XmlNode 单个节点信息类XmlNodeList 多个节点信息类 XmlDocument 用于创建节点 存储文件XmlDeclaration 用于添加版本信息XmlElement 节点类通过代码API创建XML信息,不需要手动编写的流程
0.及记录存储文件夹信息的路径 string path = Application.persistentDataPath + "/要创建的文件夹名.xml";1.创建文本对象
XmlDocument xml = new XmlDocument();2.添加固定版本信息
//相当于就是创建<?xml version="1.0" encoding="UTF-8"?>这句XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");//创建完成过后 要添加进入 文本对象中xml.AppendChild(xmlDec); 3. 添加根节点 XmlElement root = xml.CreateElement("Root");xml.AppendChild(root); 4.为根节点添加子节点 XmlElement name = xml.CreateElement("name");name.InnerText = "孙悟空";root.AppendChild(name);XmlElement age = xml.CreateElement("age");atk.InnerText = "10";root.AppendChild(age);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); 5.添加属性 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);6.保存
xml.Save(path);🎶(G) 修改XML文件中的信息(c#)
1.相关类:
XmlNode 单个节点信息类XmlNodeList 多个节点信息类 XmlDocument 用于创建节点 存储文件XmlDeclaration 用于添加版本信息XmlElement 节点类string path = Application.persistentDataPath + “/要创建的文件夹名.xml”;
1.判断是否存在文件
File.Exists(path)
2.加载XML文件APInewXml.Load(path);
【newXml -> XmlDocument类】
3.创建节点newXml.CreateElement(“节点名字”);
5.增加子节点root.AppendChild(node)
6.移除子节点root.RemoveChild(node); 【root -> XmlElemen节点类】
if( File.Exists(path) ){//加载 newXml.Load(path);//移除XmlNode node;node = newXml.SelectSingleNode("Root/atk");//得到父节点XmlNode root2 = newXml.SelectSingleNode("Root");//移除子节点root2.RemoveChild(node);//添加节点XmlElement speed = newXml.CreateElement("moveSpeed");speed.InnerText = "20";root2.AppendChild(speed);//记得存newXml.Save(path);}🎶(s) XML 练习
XML编写练习
当出现没有变量名的数据时 就用变量类型名命名
读取练习 //将一个和PlayerInfo相同信息的XML文件的值读取出来赋给另一个对象public class Item{public int id;public int num;}public class PlayerInfo{public string name;public int atk;public int def;public float moveSpeed;public float roundSpeed;public Item weapon;public List<int> listInt;public List<Item> itemList;public Dictionary<int, Item> itemDic;public void LoadData(string fileName){//加载XML文件信息XmlDocument xml = new XmlDocument();//加载xml.Load(Application.streamingAssetsPath + "/" + fileName + ".xml");//从文件中加载出具体的数据//加载根节点 才能加载后面的内容XmlNode playerInfo = xml.SelectSingleNode("PlayerInfo");//通过根节点 去加载具体的信息this.name = playerInfo.SelectSingleNode("name").InnerText;this.atk = int.Parse(playerInfo.SelectSingleNode("atk").InnerText);this.def = int.Parse(playerInfo.SelectSingleNode("def").InnerText);this.moveSpeed = float.Parse(playerInfo.SelectSingleNode("moveSpeed").InnerText);this.roundSpeed = float.Parse(playerInfo.SelectSingleNode("roundSpeed").InnerText);XmlNode weaponNode = playerInfo.SelectSingleNode("weapon");this.weapon = new Item();this.weapon.id = int.Parse(weaponNode.SelectSingleNode("id").InnerText);this.weapon.num = int.Parse(weaponNode.SelectSingleNode("num").InnerText);XmlNode listIntNode = playerInfo.SelectSingleNode("listInt");XmlNodeList intList = listIntNode.SelectNodes("int");this.listInt = new List<int>();for (int i = 0; i < intList.Count; i++){this.listInt.Add(int.Parse(intList[i].InnerText));}XmlNode itemList = playerInfo.SelectSingleNode("itemList");XmlNodeList items = itemList.SelectNodes("Item");this.itemList = new List<Item>();foreach (XmlNode item in items){Item item2 = new Item();item2.id = int.Parse(item.Attributes["id"].Value);item2.num = int.Parse(item.Attributes["num"].Value);this.itemList.Add(item2);}XmlNode itemDic = playerInfo.SelectSingleNode("itemDic");XmlNodeList keyInt = itemDic.SelectNodes("int");XmlNodeList valueItem = itemDic.SelectNodes("Item");this.itemDic = new Dictionary<int, Item>();for (int i = 0; i < keyInt.Count; i++){int key = int.Parse(keyInt[i].InnerText);Item value = new Item();value.id = int.Parse(valueItem[i].Attributes["id"].Value);value.num = int.Parse(valueItem[i].Attributes["num"].Value);this.itemDic.Add(key, value);}}} 存取练习 //封装一个将信息存到一个XML文件中的方法public void SaveData(string fileName){//决定存储路径string path = Application.persistentDataPath + "/" + fileName + ".xml";Debug.Log(Application.persistentDataPath);//5个步骤//1.创建我们的Xml文本 XmlDocument xml = new XmlDocument();//2.添加固定内容XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");xml.AppendChild(xmlDec);//3.添加根节点XmlElement playerInfo = xml.CreateElement("PlayerInfo");xml.AppendChild(playerInfo);//4.添加子节点 或者 属性相关XmlElement name = xml.CreateElement("name");name.InnerText = this.name;playerInfo.AppendChild(name);XmlElement atk = xml.CreateElement("atk");atk.InnerText = this.atk.ToString();playerInfo.AppendChild(atk);XmlElement def = xml.CreateElement("def");def.InnerText = this.def.ToString();playerInfo.AppendChild(def);XmlElement moveSpeed = xml.CreateElement("moveSpeed");moveSpeed.InnerText = this.moveSpeed.ToString();playerInfo.AppendChild(moveSpeed);XmlElement roundSpeed = xml.CreateElement("roundSpeed");roundSpeed.InnerText = this.roundSpeed.ToString();playerInfo.AppendChild(roundSpeed);//weaponXmlElement weapon = xml.CreateElement("weapon");XmlElement id = xml.CreateElement("id");id.InnerText = this.weapon.id.ToString();weapon.AppendChild(id);XmlElement num = xml.CreateElement("num");num.InnerText = this.weapon.num.ToString();weapon.AppendChild(num);playerInfo.AppendChild(weapon);//listIntXmlElement listInt = xml.CreateElement("listInt");for (int i = 0; i < this.listInt.Count; i++){XmlElement intNode = xml.CreateElement("int");intNode.InnerText = this.listInt[i].ToString();listInt.AppendChild(intNode);}playerInfo.AppendChild(listInt);//itemListXmlElement itemList = xml.CreateElement("itemList");for (int i = 0; i < this.itemList.Count; i++){XmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemList[i].id.ToString());itemNode.SetAttribute("num", this.itemList[i].num.ToString());itemList.AppendChild(itemNode);}playerInfo.AppendChild(itemList);//itemDicXmlElement itemDic = xml.CreateElement("itemDic");foreach (int key in this.itemDic.Keys){//keyXmlElement intNode = xml.CreateElement("int");intNode.InnerText = key.ToString();itemDic.AppendChild(intNode);//valueXmlElement itemNode = xml.CreateElement("Item");itemNode.SetAttribute("id", this.itemDic[key].id.ToString());itemNode.SetAttribute("num", this.itemDic[key].num.ToString());itemDic.AppendChild(itemNode);}playerInfo.AppendChild(itemDic);//5.存储xml.Save(path);} ⭐🅰️⭐⭐【Unityc#专题篇】之c#进阶篇】
⭐【Unityc#专题篇】之c#核心篇】
⭐【Unityc#专题篇】之c#基础篇】
⭐【Unity-c#专题篇】之c#入门篇】
⭐【Unityc#专题篇】—进阶章题单实践练习
⭐【Unityc#专题篇】—基础章题单实践练习
⭐【Unityc#专题篇】—核心章题单实践练习
你们的点赞👍 收藏⭐ 留言📝 关注✅是我持续创作,输出优质内容的最大动力!、