Unity_数据持久化_XML存储相关

发布于:2025-08-03 ⋅ 阅读:(7) ⋅ 点赞:(0)

Unity数据持久化

三、XML数据持久化

3.3 XML文件存储路径与操作

3.3.1 知识点一:决定存储在哪个文件夹下

注意:存储xml文件在Unity中一定是使用各平台都可读可写可找到的路径

各路径评估:

1. Resources 可读不可写 打包后找不到 ×

  • 只能读取,无法写入
  • 打包后路径不存在
  • 不适用于需要修改的XML文件

2. Application.streamingAssetsPath 可读 PC端可写找得到 ×

  • 可读取,PC端可写入
  • 移动端只读
  • 跨平台兼容性有限

3. Application.dataPath 打包后找不到 ×

  • 编辑器中可用
  • 打包后路径不存在
  • 不适用于运行时数据

4. Application.persistentDataPath 可读可写找得到 √

  • 所有平台可读可写
  • 打包后路径仍然存在
  • 推荐用于XML文件存储
3.3.2 知识点二:存储xml文件

核心概念:
XML文件存储是指将XML数据保存到本地文件系统中的过程。在Unity中,我们需要选择合适的存储路径,并使用正确的方法来创建和保存XML文件。

存储位置选择:

// 推荐使用Application.persistentDataPath作为XML文件存储路径
string path = Application.persistentDataPath + "/PlayerInfo2.xml";

基本存储方法:

1. 创建XML文档的五步法

// 关键类:XmlDocument, XmlDeclaration, XmlElement
// 存储有五步

// 1. 创建XmlDocument对象
XmlDocument xml = new XmlDocument();

// 2. 添加固定版本信息
XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
xml.AppendChild(xmlDec);

// 3. 创建根节点
XmlElement root = xml.CreateElement("PlayerInfo");
xml.AppendChild(root);

// 4. 创建子节点
XmlElement name = xml.CreateElement("name");
name.InnerText = "张三";
root.AppendChild(name);

// 5. 保存文件
xml.Save(path);

2. 复杂数据结构存储

// 存储列表数据
XmlElement listInt = xml.CreateElement("listInt");
for(int i = 0; i < 5; i++)
{
    XmlElement intElement = xml.CreateElement("int");
    intElement.InnerText = i.ToString();
    listInt.AppendChild(intElement);
}
root.AppendChild(listInt);

// 存储带属性的列表数据
XmlElement itemList = xml.CreateElement("itemList");
for(int i = 0; i < 5; i++)
{
    XmlElement itemElement = xml.CreateElement("item");
    itemElement.SetAttribute("id", i.ToString());
    itemElement.SetAttribute("num", (i*10).ToString());
    itemList.AppendChild(itemElement);
}
root.AppendChild(itemList);

3. 完整的XML存储示例

using UnityEngine;
using System.Xml;
using System.IO;

public class SaveData : MonoBehaviour
{
    void Start()
    {
        // 设置存储路径
        string path = Application.persistentDataPath + "/PlayerInfo2.xml";
        print(path);
        
        // 创建XML文档
        XmlDocument xml = new XmlDocument();
        
        // 添加XML声明
        XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
        xml.AppendChild(xmlDec);
        
        // 创建根节点
        XmlElement root = xml.CreateElement("PlayerInfo");
        xml.AppendChild(root);
        
        // 添加基本信息
        XmlElement name = xml.CreateElement("name");
        name.InnerText = "张三";
        root.AppendChild(name);
        
        // 添加列表数据
        XmlElement listInt = xml.CreateElement("listInt");
        for(int i = 0; i < 5; i++)
        {
            XmlElement intElement = xml.CreateElement("int");
            intElement.InnerText = i.ToString();
            listInt.AppendChild(intElement);
        }
        root.AppendChild(listInt);
        
        // 添加带属性的列表数据
        XmlElement itemList = xml.CreateElement("itemList");
        for(int i = 0; i < 5; i++)
        {
            XmlElement itemElement = xml.CreateElement("item");
            itemElement.SetAttribute("id", i.ToString());
            itemElement.SetAttribute("num", (i*10).ToString());
            itemList.AppendChild(itemElement);
        }
        root.AppendChild(itemList);
        
        // 保存文件
        xml.Save(path);
        print("保存成功");
    }
}

通过以上方法,可以安全、高效地在Unity中存储XML文件,为游戏提供可靠的数据持久化解决方案。

3.3.3 知识点三:修改xml文件

核心概念:
XML文件修改是指在已存在的XML文件中更新、添加或删除数据的过程。在Unity中,我们需要先加载XML文件,然后进行修改操作,最后保存文件。

修改XML文件的基本步骤:

1. 加载XML文件

// 检查文件是否存在
if(File.Exists(path))
{
    // 创建新的XmlDocument对象
    XmlDocument xml2 = new XmlDocument();
    // 加载XML文件
    xml2.Load(path);
}

2. 修改节点内容

// 修改单个节点的文本内容
XmlNode node = xml2.SelectSingleNode("PlayerInfo/name");
node.InnerText = "李四";
xml2.Save(path);
print("修改name成功");

3. 修改列表中的特定元素

// 获取列表节点
XmlNodeList node2 = xml2.SelectNodes("PlayerInfo/listInt/int");
// 修改第一个元素(索引0)
node2[0].InnerText = "100";
xml2.Save(path);
print("修改listInt成功");

4. 修改带属性的元素

// 获取带属性的元素列表
XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");
// 修改第三个元素(索引2)的属性
// 注意:需要将XmlNode转换为XmlElement才能使用SetAttribute
((XmlElement)node3[2]).SetAttribute("num", "100");
((XmlElement)node3[2]).SetAttribute("id", "100");
xml2.Save(path);
print("修改itemList成功");

5. 完整的XML修改示例

using UnityEngine;
using System.Xml;
using System.IO;

public class SaveData : MonoBehaviour
{
    void Start()
    {
        string path = Application.persistentDataPath + "/PlayerInfo2.xml";
        
        // 先创建XML文件(如果不存在)
        CreateXmlFile(path);
        
        // 修改XML文件
        if(File.Exists(path))
        {
            XmlDocument xml2 = new XmlDocument();
            xml2.Load(path);
            
            // 修改节点内容
            XmlNode node = xml2.SelectSingleNode("PlayerInfo/name");
            node.InnerText = "李四";
            xml2.Save(path);
            print("修改name成功");
            
            // 修改列表元素
            XmlNodeList node2 = xml2.SelectNodes("PlayerInfo/listInt/int");
            node2[0].InnerText = "100";
            xml2.Save(path);
            print("修改listInt成功");
            
            // 修改带属性的元素
            XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");
            ((XmlElement)node3[2]).SetAttribute("num", "100");
            ((XmlElement)node3[2]).SetAttribute("id", "100");
            xml2.Save(path);
            print("修改itemList成功");
        }
    }
    
    private void CreateXmlFile(string path)
    {
        // 创建XML文件的代码(与存储部分相同)
        XmlDocument xml = new XmlDocument();
        XmlDeclaration xmlDec = xml.CreateXmlDeclaration("1.0", "UTF-8", "");
        xml.AppendChild(xmlDec);
        
        XmlElement root = xml.CreateElement("PlayerInfo");
        xml.AppendChild(root);
        
        XmlElement name = xml.CreateElement("name");
        name.InnerText = "张三";
        root.AppendChild(name);
        
        // 添加其他元素...
        xml.Save(path);
    }
}

修改XML文件的关键要点:

1. 类型转换

  • SelectNodes返回的是XmlNodeList,元素类型是XmlNode
  • 修改属性需要使用SetAttribute方法,该方法只在XmlElement中存在
  • 需要将XmlNode强制转换为XmlElement((XmlElement)node3[2])

2. 索引访问

  • 使用索引访问列表中的特定元素:node2[0]node3[2]
  • 索引从0开始计数
  • 确保索引不超出范围

3. 保存操作

  • 每次修改后都需要调用xml2.Save(path)保存文件
  • 如果不保存,修改不会写入文件

4. 错误处理

try
{
    XmlNodeList node3 = xml2.SelectNodes("PlayerInfo/itemList/item");
    if (node3.Count > 2)
    {
        ((XmlElement)node3[2]).SetAttribute("num", "100");
        xml2.Save(path);
        print("修改成功");
    }
    else
    {
        print("索引超出范围");
    }
}
catch (System.Exception e)
{
    print("修改失败:" + e.Message);
}

通过以上方法,可以安全、高效地修改XML文件,为游戏提供灵活的数据更新能力。