Unity学习笔记–数据持久化XML文件(1)

  • Unity学习笔记–数据持久化XML文件(1)已关闭评论
  • 81 次浏览
  • A+
所属分类:.NET技术
摘要

Xml是可拓展标记语言,一种文件格式。我们使用xml来完成对数据持久化的存储。等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储。


XML相关

Xml是可拓展标记语言,一种文件格式。我们使用xml来完成对数据持久化的存储。等待我们有一程序运行结束之后,将内存中的数据进行保存,(保存在硬盘/服务器)实现对数据的持久化存储。

xml文件的读取和保存以及修改

要点:

  1. XMl文件的加载

  2. XML文件节点的查找访问

  3. XML文件节点内容的读取 (InnerText还是Attributes["id"].Value 形式访问)

    代码中有详细注释!可供参考对比学习!

using System.IO; using System.Xml; using UnityEngine;  namespace Building.XML {     public class LoadXMLFile:MonoBehaviour     {         private void Start()         {             //得到xml文件             XmlDocument xmlFile = new XmlDocument();             //通过加载text格式进行解析成xml形式进行获取             //TextAsset textAsset = Resources.Load<TextAsset>("Text");             // xmlFile.LoadXml(textAsset.text);             //通过路径进行加载             xmlFile.Load(Application.streamingAssetsPath+"/Text.xml");                          //读取xml中节点             XmlNode root = xmlFile.SelectSingleNode("PlayerInfo");             XmlNode nodeName = root.SelectSingleNode("Name");             XmlNode nodeList = root.SelectSingleNode("Item");             //获取自定义版本的数据结构类型             print(nodeList.Attributes["id"].Value);             print(nodeList.Attributes["size"].Value);             //或者             print(nodeList.Attributes.GetNamedItem("id").Value);             print(nodeList.Attributes.GetNamedItem("size").Value);                          //直接获取数组中的元素             XmlNode tempNodeList1 = root.SelectSingleNode("ItemList1");             XmlNodeList xmlNodeList1 = tempNodeList1.SelectNodes("Item");             //找出List中所有的节点  打印节点组中的 id size节点的InnerText             //var 类型推断不出来 XmlNode类型             foreach (XmlNode item in xmlNodeList1)             {                 print(item.Name);                 print(item.SelectSingleNode("id").InnerText);               /* <Item>                 <id>2003</id>>   通过InnerText来访问<> <>中间的内容                  <size>17.5</size>>                </Item>>*/                 print(item.SelectSingleNode("size").InnerText);             }              for (int i = 0; i < xmlNodeList1.Count; i++)             {                 print(xmlNodeList1[i].Name);                 print(xmlNodeList1[i].SelectSingleNode("id").InnerText);                 print(xmlNodeList1[i].SelectSingleNode("size").InnerText);             }                          //直接获取数组中的元素 形式  innerText访问还是获取  Attributes["size"].Value 访问数值             //-------注意区分元素中是否还有子节点 根据是否有子节点来选择获取节点内容             XmlNode tempNodeList = root.SelectSingleNode("ItemList");             XmlNodeList xmlNodeList = tempNodeList.SelectNodes("Item");             //找出List中所有的节点  打印节点组中的 id size节点的InnerText             //var 类型推断不出来 XmlNode类型             foreach (XmlNode item in xmlNodeList)             {                 print(item.Name);                 print(item.Attributes["id"].InnerText);                 print(item.Attributes["size"].Value);             }              for (int i = 0; i < xmlNodeList.Count; i++)             {                 print(xmlNodeList[i].Name);                 print(xmlNodeList[i].Attributes["id"].Value); //<Item id="2011" size="15.5"/>                                                               //单行内嵌的 通过Attributs["name"].Value访问                 print(xmlNodeList[i].Attributes["size"].Value);             }                         //============================读================             //==================xml存储的路径             // 1.Resources 可读 不可写 打包后找不到  ×             // 2.Application.streamingAssetsPath 可读 PC端可写 找得到  ×             // 3.Application.dataPath 打包后找不到  ×             // 4.Application.persistentDataPath 可读可写找得到   √              string path = Application.streamingAssetsPath + "/xmlSaveFile.xml";             print(Application.persistentDataPath);                          //创建固定版本信息             XmlDocument saveXmlFile = new XmlDocument();             //文件格式声明             XmlDeclaration xmlDeclaration = saveXmlFile.CreateXmlDeclaration("1.0", "utf-8", "");             saveXmlFile.AppendChild(xmlDeclaration);                          //添加根节点             //这里以存储班级信息为例子             XmlElement classInfo =saveXmlFile.CreateElement("ClassInfo");             saveXmlFile.AppendChild(classInfo);                          //创建子节点             XmlElement teacher = saveXmlFile.CreateElement("teacher");             classInfo.AppendChild(teacher);              XmlElement teacherName = saveXmlFile.CreateElement("teacherName");             teacherName.InnerText = "TonyChang";             teacher.AppendChild(teacherName);                          XmlElement teacherId = saveXmlFile.CreateElement("teacherId");             teacherId.InnerText = "3306";//设置teacherID名称             teacher.AppendChild(teacherId);              //学生信息模块             XmlElement stusElement = saveXmlFile.CreateElement("Students");             XmlElement stuEle;//学生信息             for (int i = 0; i < 15; i++)             {                 stuEle = saveXmlFile.CreateElement("Student");                 stuEle.SetAttribute("stuNo", (i + 1).ToString());                 stuEle.SetAttribute("age", 19.ToString());                 stusElement.AppendChild(stuEle);             }             //学生信息模块添加到xml文件中             classInfo.AppendChild(stusElement);                          //保存Xml文件             saveXmlFile.Save(path);              //----------------------XML的内容修改------------------------             if (File.Exists(path))             {                 XmlDocument Xml1 = new XmlDocument();                 //加载到新建的的xml文件中                 Xml1.Load(path);                                  //获取要修改的文件节点                 XmlNode changeNode;                 changeNode = Xml1.SelectSingleNode("ClassInfo/teacher/teacherId");                 //将3306-->8888                 changeNode.InnerText = "8888";                  //---删除(通过父节点删除)                 XmlNode FatherNode = Xml1.SelectSingleNode("ClassInfo/teacher");                 FatherNode.RemoveChild(changeNode);                  //---添加新的节点                 XmlNode changedNode=Xml1.CreateElement("teacherId");                 changedNode.InnerText = "8888";                 FatherNode.AppendChild(changedNode);                                  //修改了记得保存                 Xml1.Save(path);             }         }     } } 

textXML文件

<?xml version="1.0" encoding="utf-8"?> <!--注释内容--> <PlayerInfo >     <name>TonyChang</name>     <age>18</age>     <height>175.5</height>>     <Item id="1997" size="12.5"/>     <Item1>         <id>1998</id>>         <size>12.25</size>     </Item1>>     <ItemList1>         <!--属性         和元素节点的区别?         表现形式不同的同种意义         -->         <Item>             <id>2002</id>>             <size>16.5</size>>         </Item>>         <Item>             <id>2003</id>>             <size>17.5</size>>         </Item>>         <Item>             <id>2004</id>>             <size>18.5</size>>         </Item>>     </ItemList1>     <ItemList>         <!--属性         和元素节点的区别?         表现形式不同的同种意义         -->         <Item id="2011" size="15.5"/>         <Item id="2012" size="16.5"/>         <Item id="2013" size="17.5"/>     </ItemList> </PlayerInfo> 

Unity学习笔记--数据持久化XML文件(1)

文件格式如图所示;

生成新建的“xmlSaveFile.xml”文件内容

Unity学习笔记--数据持久化XML文件(1)