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

这篇具有很好参考价值的文章主要介绍了Unity学习笔记--数据持久化XML文件(1)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

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)

XML的序列化与反序列化

序列化:

using System.Collections.Generic;
using System.IO;
using System.Xml.Serialization;
using UnityEngine;
public class Test
{
    public int testPub = 10;
    private int testPri = 5;
    protected int testProtect = 12;
    internal int testInter = 15;

    public string testStr = "TonyChang";
    //属性
    public int testPro { get; set; }
    //数组
    public int[] arrayInt=new []{2,4,6,8};

    //自定义类
    public Test2 Test2 = new Test2();
    
    //list
    //更改数组属性名字
    [XmlArray("IntList")]
    [XmlArrayItem("TCInt")]
    public List<int> listInt=new List<int>(){1,5,7,8,9};

    //不支持字典
   // public Dictionary<int, string> testDic = new Dictionary<int, string>() {{1, "Jerry"},{2,"Tom"}};
}

public class Test2
{
    //属性标签
    [XmlAttribute("Test2")] public int xmlTest = 5;
    [XmlAttribute()] public float test2Float = 6.6f;
    [XmlAttribute()] public bool aryUok = true;
}
/// <summary>
/// XML的序列化与反序列化
/// </summary>
public class XMLDemo : MonoBehaviour
{
    
    private void Start()
    {
        //要存储为XML文件的文件流
        Test test = new Test();
        string path = Application.persistentDataPath + "/XMLTest01.xml";
        print(path);
        //流语句
        //using加载文件 文件加载结束之后则会自动关闭
        using(StreamWriter stream = new StreamWriter(path) )
        {
            XmlSerializer xmlSerializer = new XmlSerializer(typeof(Test));
            //将XML文件序列化 写入流中
            //流根据配置的写入地址进行设置
            xmlSerializer.Serialize(stream,test);
        }
    }
}
  • 只能进行公共类型变量的存储
  • 不支持字典存储

对应生成的XML文件如下图所示:

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

反序列化:文章来源地址https://www.toymoban.com/news/detail-746905.html

//反序列化
//判断是否存在要读取的XML文件
if (File.Exists(path))
{
using (StringReader reader = new StringReader(path))
{
XmlSerializer xmlSerializer = new XmlSerializer(typeof(Test));
Test testReaded=xmlSerializer.Deserialize(reader) as Test;
}
}
//tips:
//list对象中有默认值时候,反序列化时候会把默认值再次添加到list数组中
//可以理解为 当前反序列化时候要考察各种变量的默认值(初始值)
//如果过本身序列化时候会有new List(){1,2,3}之类的赋值操作
//则反序列化时会重新将1,2,3数值添加到list数组中,得到的
//反序列化结果中会有两个1,2,3  1,2,3 内容

到了这里,关于Unity学习笔记--数据持久化XML文件(1)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Unity】二进制文件 数据持久化(修改版)【个人复习笔记/有不足之处欢迎斧正/侵删】

             变量的本质都是二进制 ,在内存中都以字节的形式存储着,通过sizeof方法可以看到常用变量类型占用的字节空间长度( 1byte = 8bit,1bit(位)不是0就是1 )         二进制文件读写的本质: 将各类型变量转换为字节数组,将字节数组直接存储到文件中 ,不仅可以节

    2024年04月17日
    浏览(49)
  • Unity笔记:数据持久化的几种方式

    主要方法: ScriptableObject PlayerPrefs JSON XML 数据库(如Sqlite) PlayerPrefs 存储的数据是 全局共享 的,它们存储在用户设备的本地存储中,并且可以被应用程序的所有部分访问。这意味着,无论在哪个场景、哪个脚本中,只要是同一个应用程序中的代码,都可以读取和修改 Playe

    2024年02月19日
    浏览(44)
  • 【Unity学习日记03】数据持久化

    这一篇只能说写了一部分,并没有把Unity里数据持久化的操作讲完整,之后可能是学到一点就记一点的模式。 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。 人话版:将游戏数据存储到硬盘,硬盘中数据读取到游戏中,

    2024年02月12日
    浏览(52)
  • 「学习笔记」可持久化线段树

    可持久化数据结构 (Persistent data structure) 总是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 主席树全称是可持久化权值线段树,给定 (n) 个整数构成的序列 (a) ,将对于指定的闭区间 (left[l, rright]) 查询其区间内的第 (k) 小值。 图片来自 (texttt{OI-w

    2024年02月02日
    浏览(35)
  • ?「学习笔记」可持久化线段树?

    可持久化数据结构 (Persistent data structure) 总是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 主席树全称是可持久化权值线段树,给定 (n) 个整数构成的序列 (a) ,将对于指定的闭区间 (left[l, rright]) 查询其区间内的第 (k) 小值。 图片来自 (texttt{OI-w

    2024年02月02日
    浏览(41)
  • 「学习笔记」可持久化线段树?

    可持久化数据结构 (Persistent data structure) 总是可以保留每一个历史版本,并且支持操作的不可变特性 (immutable)。 主席树全称是可持久化权值线段树,给定 (n) 个整数构成的序列 (a) ,将对于指定的闭区间 (left[l, rright]) 查询其区间内的第 (k) 小值。 图片来自 (texttt{OI-w

    2024年02月02日
    浏览(36)
  • Unity数据持久化之PlayerPrefs

    什么是数据持久化 数据持久化就是将内存中的数据模型转换为存储模型,以及将存储模型转换为内存中的数据模型的统称。即将游戏数据存储到硬盘,硬盘中数据读取到游戏中,也就是传统意义上的存盘。 PlayerPrefs是什么 是 Unity 提供的可以用于存储读取玩家数据的公共类

    2024年02月19日
    浏览(47)
  • Unity之数据持久化——Json

    JavaScript对象简谱(JavaScript Object Notation) json是国际通用的一种轻量级的数据交换格式,主要在网络通讯中用于传输数据,或本地数据存储和读取,易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率 游戏中可以把游戏数据按照Json的格式标准存储在

    2023年04月20日
    浏览(39)
  • Unity PlayerPrefs 持久化数据存在哪

    在游戏开发的过程中,我们经常需要存档相关的东西,称为数据的持久化。PlayerPrefs 就是Unity提供的用于本地数据持久化保存与读取的类。 PlayerPrefs会以键值对的方式存储在本地的注册表中。 1.存储数据 2.获取数据 3.删除数据 这些数据会存储在注册表中,打开注册表就能查看

    2024年02月16日
    浏览(45)
  • 【unity之数据持久化】-Unity公共类PlayerPrefs

    👨‍💻个人主页 :@元宇宙-秩沅 👨‍💻 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 👨‍💻 本文由 秩沅 原创 👨‍💻 收录于专栏 : unity数据存储 API大全图解 windows平台存储路径 HKCUSoftware[公司名称][产品名称] 项下的注册表中 公司和产品名称是 在“Project Settings”中设

    2024年02月04日
    浏览(54)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包