翼度科技»论坛 编程开发 .net 查看内容

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

6

主题

6

帖子

18

积分

新手上路

Rank: 1

积分
18
XML相关

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

  • XMl文件的加载
  • XML文件节点的查找访问
  • XML文件节点内容的读取 (InnerText还是Attributes["id"].Value 形式访问)
    代码中有详细注释!可供参考对比学习!
  1. using System.IO;
  2. using System.Xml;
  3. using UnityEngine;
  4. namespace Building.XML
  5. {
  6.     public class LoadXMLFile:MonoBehaviour
  7.     {
  8.         private void Start()
  9.         {
  10.             //得到xml文件
  11.             XmlDocument xmlFile = new XmlDocument();
  12.             //通过加载text格式进行解析成xml形式进行获取
  13.             //TextAsset textAsset = Resources.Load<TextAsset>("Text");
  14.             // xmlFile.LoadXml(textAsset.text);
  15.             //通过路径进行加载
  16.             xmlFile.Load(Application.streamingAssetsPath+"/Text.xml");
  17.             
  18.             //读取xml中节点
  19.             XmlNode root = xmlFile.SelectSingleNode("PlayerInfo");
  20.             XmlNode nodeName = root.SelectSingleNode("Name");
  21.             XmlNode nodeList = root.SelectSingleNode("Item");
  22.             //获取自定义版本的数据结构类型
  23.             print(nodeList.Attributes["id"].Value);
  24.             print(nodeList.Attributes["size"].Value);
  25.             //或者
  26.             print(nodeList.Attributes.GetNamedItem("id").Value);
  27.             print(nodeList.Attributes.GetNamedItem("size").Value);
  28.             
  29.             //直接获取数组中的元素
  30.             XmlNode tempNodeList1 = root.SelectSingleNode("ItemList1");
  31.             XmlNodeList xmlNodeList1 = tempNodeList1.SelectNodes("Item");
  32.             //找出List中所有的节点  打印节点组中的 id size节点的InnerText
  33.             //var 类型推断不出来 XmlNode类型
  34.             foreach (XmlNode item in xmlNodeList1)
  35.             {
  36.                 print(item.Name);
  37.                 print(item.SelectSingleNode("id").InnerText);  
  38.             /* <Item>
  39.                 <id>2003</id>>   通过InnerText来访问<> <>中间的内容
  40.                 <size>17.5</size>>
  41.                </Item>>*/
  42.                 print(item.SelectSingleNode("size").InnerText);
  43.             }
  44.             for (int i = 0; i < xmlNodeList1.Count; i++)
  45.             {
  46.                 print(xmlNodeList1[i].Name);
  47.                 print(xmlNodeList1[i].SelectSingleNode("id").InnerText);
  48.                 print(xmlNodeList1[i].SelectSingleNode("size").InnerText);
  49.             }
  50.             
  51.             //直接获取数组中的元素 形式  innerText访问还是获取  Attributes["size"].Value 访问数值
  52.             //-------注意区分元素中是否还有子节点 根据是否有子节点来选择获取节点内容
  53.             XmlNode tempNodeList = root.SelectSingleNode("ItemList");
  54.             XmlNodeList xmlNodeList = tempNodeList.SelectNodes("Item");
  55.             //找出List中所有的节点  打印节点组中的 id size节点的InnerText
  56.             //var 类型推断不出来 XmlNode类型
  57.             foreach (XmlNode item in xmlNodeList)
  58.             {
  59.                 print(item.Name);
  60.                 print(item.Attributes["id"].InnerText);
  61.                 print(item.Attributes["size"].Value);
  62.             }
  63.             for (int i = 0; i < xmlNodeList.Count; i++)
  64.             {
  65.                 print(xmlNodeList[i].Name);
  66.                 print(xmlNodeList[i].Attributes["id"].Value); //<Item id="2011" size="15.5"/>
  67.                                                               //单行内嵌的 通过Attributs["name"].Value访问
  68.                 print(xmlNodeList[i].Attributes["size"].Value);
  69.             }
  70.            
  71.             //============================读================
  72.             //==================xml存储的路径
  73.             // 1.Resources 可读 不可写 打包后找不到  ×
  74.             // 2.Application.streamingAssetsPath 可读 PC端可写 找得到  ×
  75.             // 3.Application.dataPath 打包后找不到  ×
  76.             // 4.Application.persistentDataPath 可读可写找得到   √
  77.             string path = Application.streamingAssetsPath + "/xmlSaveFile.xml";
  78.             print(Application.persistentDataPath);
  79.             
  80.             //创建固定版本信息
  81.             XmlDocument saveXmlFile = new XmlDocument();
  82.             //文件格式声明
  83.             XmlDeclaration xmlDeclaration = saveXmlFile.CreateXmlDeclaration("1.0", "utf-8", "");
  84.             saveXmlFile.AppendChild(xmlDeclaration);
  85.             
  86.             //添加根节点
  87.             //这里以存储班级信息为例子
  88.             XmlElement classInfo =saveXmlFile.CreateElement("ClassInfo");
  89.             saveXmlFile.AppendChild(classInfo);
  90.             
  91.             //创建子节点
  92.             XmlElement teacher = saveXmlFile.CreateElement("teacher");
  93.             classInfo.AppendChild(teacher);
  94.             XmlElement teacherName = saveXmlFile.CreateElement("teacherName");
  95.             teacherName.InnerText = "TonyChang";
  96.             teacher.AppendChild(teacherName);
  97.             
  98.             XmlElement teacherId = saveXmlFile.CreateElement("teacherId");
  99.             teacherId.InnerText = "3306";//设置teacherID名称
  100.             teacher.AppendChild(teacherId);
  101.             //学生信息模块
  102.             XmlElement stusElement = saveXmlFile.CreateElement("Students");
  103.             XmlElement stuEle;//学生信息
  104.             for (int i = 0; i < 15; i++)
  105.             {
  106.                 stuEle = saveXmlFile.CreateElement("Student");
  107.                 stuEle.SetAttribute("stuNo", (i + 1).ToString());
  108.                 stuEle.SetAttribute("age", 19.ToString());
  109.                 stusElement.AppendChild(stuEle);
  110.             }
  111.             //学生信息模块添加到xml文件中
  112.             classInfo.AppendChild(stusElement);
  113.             
  114.             //保存Xml文件
  115.             saveXmlFile.Save(path);
  116.             //----------------------XML的内容修改------------------------
  117.             if (File.Exists(path))
  118.             {
  119.                 XmlDocument Xml1 = new XmlDocument();
  120.                 //加载到新建的的xml文件中
  121.                 Xml1.Load(path);
  122.                
  123.                 //获取要修改的文件节点
  124.                 XmlNode changeNode;
  125.                 changeNode = Xml1.SelectSingleNode("ClassInfo/teacher/teacherId");
  126.                 //将3306-->8888
  127.                 changeNode.InnerText = "8888";
  128.                 //---删除(通过父节点删除)
  129.                 XmlNode FatherNode = Xml1.SelectSingleNode("ClassInfo/teacher");
  130.                 FatherNode.RemoveChild(changeNode);
  131.                 //---添加新的节点
  132.                 XmlNode changedNode=Xml1.CreateElement("teacherId");
  133.                 changedNode.InnerText = "8888";
  134.                 FatherNode.AppendChild(changedNode);
  135.                
  136.                 //修改了记得保存
  137.                 Xml1.Save(path);
  138.             }
  139.         }
  140.     }
  141. }
复制代码
textXML文件
  1. <?xml version="1.0" encoding="utf-8"?>
  2. <PlayerInfo >
  3.     <name>TonyChang</name>
  4.     <age>18</age>
  5.     <height>175.5</height>>
  6.     <Item id="1997" size="12.5"/>
  7.     <Item1>
  8.         <id>1998</id>>
  9.         <size>12.25</size>
  10.     </Item1>>
  11.     <ItemList1>
  12.         
  13.         <Item>
  14.             <id>2002</id>>
  15.             <size>16.5</size>>
  16.         </Item>>
  17.         <Item>
  18.             <id>2003</id>>
  19.             <size>17.5</size>>
  20.         </Item>>
  21.         <Item>
  22.             <id>2004</id>>
  23.             <size>18.5</size>>
  24.         </Item>>
  25.     </ItemList1>
  26.     <ItemList>
  27.         
  28.         <Item id="2011" size="15.5"/>
  29.         <Item id="2012" size="16.5"/>
  30.         <Item id="2013" size="17.5"/>
  31.     </ItemList>
  32. </PlayerInfo>
复制代码

文件格式如图所示;
生成新建的“xmlSaveFile.xml”文件内容


来源:https://www.cnblogs.com/TonyCode/archive/2023/11/20/17845010.html
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具