首页 > 其他分享 >Unity学习笔记--数据持久化XML文件(1)

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

时间:2023-11-20 22:14:16浏览次数:34  
标签:XML xml -- SelectSingleNode Unity InnerText print XmlNode 节点

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>

image-20231120215211706

文件格式如图所示;

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

image-20231120215318556

标签:XML,xml,--,SelectSingleNode,Unity,InnerText,print,XmlNode,节点
From: https://www.cnblogs.com/TonyCode/p/17845010.html

相关文章

  • 数码管
    #数码管显示系统年,月,日,时间1importturtle,datetime2defdrawling(draw):34turtle.pendown()ifdrawelseturtle.penup()5turtle.fd(40)6turtle.right(90)78defdraworigin(d):9drawling(True)ifdin[2,3,4,5,6,8,9]elsedr......
  • CAP理论
    CAP理论,即:Consistency(一致性),指的是多个副本在任何时间点上的数据保持一致。在分布式系统中,当进行写操作时,要求所有副本都要看到最新的写入数据,以保持数据的一致性。换句话说,若在一个节点上修改了数据,并且采用了一致性的约束,那么在其他节点上对该数据的访问应该能看到这个更新。......
  • Go基础面经题
    Go基础1.基础特性Go的优势天生支持并发,性能高。单一的标准代码格式,比其他语言更具可读性。自动垃圾收集机制比Java和Python更有效,因为它与程序同时执行。Go数据类型int,string,float,bool,array,slice,map,channel,pointer,struct,interface,meth......
  • 网络空间安全导论第二章
    学期(2023-2024-1)学号(20232418)《网络》第2周学习总结教材学习内容总结思维导图工具推荐:xmindprocessonwps教材学习中的问题和解决过程问题1:什么是混合密码系统?问题1解决方案:混合密码系统是一种将对称密码和公钥密码结合起来使用的密码系统。它的基本思想是利用对称......
  • 2023.11.20——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.mybatis2.JavaGUI明日计划:学习......
  • Springboot自定义starter
    Springboot自定义sarter这里通过自定义mybatis的starter来简单进行分析理解步骤:创建dmybatis-spring-boot-autoconfigure模块,提供自动配置功能,并定义配置文件META-INF/spring/xxx.imports创建dmybatis-spring-boot-starter模块,在starter中引入自动配置模块创建项目:1......
  • (私人lora数据准备)MJ数据转lora训练的处理流程
    1.【删除乱码并打标签】删前缀(用户名),删后缀(乱码),加统一标签,并打开excel微调。(输入项为1.单个文件夹地址2.需要文件夹内加上的标签名)*注意:此时若要加多个标签,请用英文逗号“,”隔开。 importosimportopenpyxlimportreUNWANTED_UNITS=["undefined","皮皮","zly324"]......
  • Elasticsearch 系列(二)- ES的基本概念
    本章将和大家分享Elasticsearch的一些基本概念。话不多说,下面我们直接进入主题。一、什么是LuceneLucene是Apache的开源搜索引擎类库,提供了搜索引擎的核心API。1、Lucene的优势:易扩展、高性能(基于倒排索引)2、Lucene的缺点:只限于Java语言开发、学习曲线陡峭、不支持水平扩展......
  • 系统时间
    '''2022310143145'''importturtle,datetimedefdrawGap():turtle.penup()turtle.fd(5)defdrawLine(draw):drawGap()turtle.pendown()ifdrawelseturtle.penup()turtle.fd(40)drawGap()turtle.rig......
  • 2023-2024-1 20232422《网络》第2周学习总结
    教材学习内容总结教材内容思维导图如下心得体会:学习密码学让我深入了解加密的基本概念,如对称加密、非对称加密、哈希函数等,理解这些概念对于设计和分析安全系统至关重要。密码学不仅仅应用于数据传输的加密,还涉及到数字签名、身份认证、安全协议等多个领域。密码学在计算......