个人主页:@元宇宙-秩沅
hallo 欢迎 点赞 收藏⭐ 留言 加关注✅!
本文由 秩沅 原创
收录于专栏:Unity基础实战
XML(Extensible Markup Language)是一种类似于 HTML,但是没有使用预定义标记的语言。因此,可以根据自己的设计需求定义专属的标记。这是一种强大将数据存储在一个可以存储、搜索和共享的格式中的方法。最重要的是,因为 XML 的基本格式是标准化的,如果你在本地或互联网上跨系统或平台共享或传输 XML,由于标准化的 XML 语法,接收者仍然可以解析数据。
特点: 是一种树形结构
世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码.电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。
ASCII,Unicode和UTF-8终于找到一个能完全搞清楚的文章了
符号 | 含义 |
---|---|
< — < | 小于 |
> — > | 大于 |
& — & | 和 |
&apos — ’ | 单引号 |
" — " | 引号 |
注意:
1.每个元素都必须有关闭标签
2.元素命名规则基本遵照C#中变量名命名规则
3.XML标签要注意大小写
4.XML文档必须有根元素
属性就是在元素标签后面空格 添加的内容
注意: 属性必须用引号包裹 单引号双引号都可以
菜鸟教程XML 格式验证器
Xml文件存放位置
1.只读不写的XML文件可以放在
Resources或者StreamingAssets 文件夹下
2.动态存储的XML文件放在
Application.persistentDataPath 路径下
C#读取XML的方法有3种
XmlDocument
XmlDocument xml = new XmlDocument();
//为TextAsset Resorces文件夹下的文本类
TextAsset asset = Resources.Load<TextAsset>("xml文件名");
print(asset.text);
//加载为xml对象
xml.LoadXml(asset.text);
xml.Load(Application.streamingAssetsPath + "/xml文件名.xml");
//streamingAssetsPath 文件夹只读(移动端)pc(可读可写)
注意: 为什么不读Resource文件夹的路径,因为打包后它被压缩了读不到
XmlDocument xml = new XmlDocument();
1.相关类:
2.获取xml当中的根节点:
3.获取下面的子节点:
4.获取节点包裹的元素信息
5.获取节点属性信息
6.获取 一个节点下的同名节点的方法
7.得到之后遍历
8.得到子节点的子节点
1.Resources 可读 不可写 打包后找不到
2.Application.streamingAssetsPath 可读 PC端可写 找得到
3.Application.dataPath 打包后找不到
4.Application.persistentDataPath 可读可写找得到
存储xml文件 在Unity中一定是使用各平台都可读可写可找到的路径
1.相关类:
通过代码API创建XML信息,不需要手动编写的流程
string path = Application.persistentDataPath + "/要创建的文件夹名.xml";
1.创建文本对象
XmlDocument xml = new XmlDocument();
2.添加固定版本信息
//相当于就是创建这句
XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
//创建完成过后 要添加进入 文本对象中
xml.AppendChild(xmlDec);
XmlElement root = xml.CreateElement("Root");
xml.AppendChild(root);
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);
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);
1.相关类:
string path = Application.persistentDataPath + “/要创建的文件夹名.xml”;
File.Exists(path)
newXml.Load(path);
【newXml -> XmlDocument类】
newXml.CreateElement(“节点名字”);
root.AppendChild(node)
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);
}
//将一个和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);
//weapon
XmlElement 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);
//listInt
XmlElement 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);
//itemList
XmlElement 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);
//itemDic
XmlElement itemDic = xml.CreateElement("itemDic");
foreach (int key in this.itemDic.Keys)
{
//key
XmlElement intNode = xml.CreateElement("int");
intNode.InnerText = key.ToString();
itemDic.AppendChild(intNode);
//value
XmlElement 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#专题篇】—核心章题单实践练习
你们的点赞 收藏⭐ 留言 关注✅是我持续创作,输出优质内容的最大动力!、