全称:可拓展标记语言(EXtensible Markup Language)
XML是国际通用的
它是被设计来用于传输和存储数据的一种文本特殊格式
文件后缀一般为.xml
文件后缀名决定了文件的格式
不同的软件可以根据后缀名用来判断文件的类型,并且在打开文件时以特定的读取规则去解析它
文件后缀名是人为定的规则,可以有无数种,可以自定义
XML文档就是使用XML格式配置填写的文档后缀一般为.xml
我们在游戏中可以把游戏数据按照XML的格式标准,存储在XML文档中,再将XML文档存储在硬盘上或者传输给远端,达到数据持久化的目的
只要能打开文档的软件都能打开 XML 文件,常用的一些打开 XML 文件的方式 :
XML 格式是一种树形结构的根结点
直接右键创建文本,后缀改为.xml,选择自己喜欢的用于编辑 xml 的软件,进行文本编辑
1.注释
2.开头
- "1.0" encoding="UTF-8"?>
3.内容
- <PlayerInfo>
- <name>xxxname>
- <age>18age>
- <sex>truesex>
- <listInt>
- <int>1int>
- <int>2int>
- <int>3int>
- listInt>
- PlayerInfo>
4.基本规则
- 每个元素都必须有关闭标签
- 元素命名规则基本遵照 C# 中变量名命名规则
- XML 标签对大小写敏感
- XML 文档必须有根元素
- 特殊的符号应该用实体引用
< ——> < (小于)
> ——> > (大于)
& ——> &(和号)
&apos ——> ' (单引号)
" ——> " (引号)
1.属性语法
属性就是在元素标签后面的空格添加的内容
注意:属性必须引用引号包裹 可以是单引号,也可以是双引号
<Friend name="xxx" age='18'>friendFriend>
如果使用属性记录信息,不想使用元素记录信息,就可以不写元素
<Friend name="xxx">
2.属性和元素结点的区别
属性和元素节点只是写法上的区别而已,我们可以选择自己喜欢的方式来记录数据
3.如何检查语法错误
放在 Resouces 或者 StreamingAssets(路径获取:Application.streamingAssetsPath) 文件夹下
放在 Application.persistentDataPath 路径下
C# 读取 XML 的方法有几种:
使用 XmlDocument 类读取是较方便最容易理解和操作的方法
示例:XML文件
- "1.0" encoding="UTF-8"?>
- <Root>
- <name>xxxname>
- <age>18age>
- <Item id="1" num="10"/>
- <Friend>
- <name>张三name>
- <age>19age>
- Friend>
- <Friend>
- <name>李四name>
- <age>20age>
- Friend>
- Root>
- 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
("TestXml"); - print(asset.text);
- // 通过这个方法 就能够翻译字符串为xml对象
- xml.LoadXml(asset.text);
-
-
- // 2.是通过xml文件的路径去进行加载
- // 存放在StreamingAssets文件夹下的xml文件加载处理
- xml.Load(Application.streamingAssetsPath + "/TestXml.xml");
节点信息类: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);
- }
存储 xml 文件,在 Unity 中一定是使用各平台都可读可写可找到的路径
Application.persistentDataPath
关键类 XmlDocument:用于创建节点 存储文件
关键类 XmlDeclaration:用于添加版本信息
关键类 XmlElement:节点类
存储有 5 步:
第一步:创建文本对象
XmlDocument xml = new XmlDocument();
第二步:添加固定版本信息
- // 这一句代码 相当于就是创建这句内容
- // 第三个参数传空串就可以了,目前不用管
- 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);
- 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);
- }