Unity数据持久化--XML

什么是 XML

XML(eXtensible Markup Language,可扩展标记语言)是一种用于存储和传输数据的标记语言。

基本语法

<?xml version="1.0" encoding="UTF-8"?>`在这里插入代码片`
<bookstore>
  <book category="fiction">
    <title lang="en">Harry Potter</title>
    <author>J.K. Rowling</author>
    <year>2005</year>
    <price>29.99</price>
  </book>
</bookstore>

XML 数据存储方式

  1. 元素存储一个值
    <time>20:45</time>
    
  2. 属性存储多个值
    <time hours="20" minutes="45"/>
    

读取和修改 XML 文件

路径选择注意事项

在 Unity 中存储 XML 文件必须使用各平台都可读可写可找到的路径:

  • Resources:可读,不可写,打包后找不到
  • Application.streamingAssetsPath:可读,PC 端可写,找得到
  • Application.dataPath:打包后找不到
  • Application.persistentDataPath:可读可写找得到(推荐)

读取操作方法

  1. XmlDocument - 数据加载到内存中,方便读取
  2. XmlTextRender - 以流的形式加载,内存占用少,但单向可读
  3. Linq(之后介绍)
XmlDocument 读取示例
// 第一步:获取文件
XmlDocument xml = new XmlDocument();
TextAsset asset = Resources.Load<TextAsset>("TestXml");
xml.LoadXml(asset.text);

// 第二步:读取元素和属性信息
// 获取根节点
XmlNode root = xml.SelectSingleNode("Root");

// 获取子节点
XmlNode nodeName = root.SelectSingleNode("name");
print(nodeName.InnerText);

// 获取属性(两种方式)
XmlNode nodeItem = root.SelectSingleNode("Item");
// 方式一
print(nodeItem.Attributes["id"].Value);
print(nodeItem.Attributes["number"].Value);
// 方式二
print(nodeItem.Attributes.GetNamedItem("id").Value);
print(nodeItem.Attributes.GetNamedItem("number").Value);

// 获取所有同名节点
XmlNodeList friendList = xml.SelectNodes("Friend");

// 遍历方式一:迭代器
foreach(XmlNode item in friendList)
{
    print(item.SelectSingleNode("name").InnerText);
    print(item.SelectSingleNode("age").InnerText);
}

// 遍历方式二:for循环
for(int i = 0; i < friendList.Count; i++)
{
    print(friendList[i].SelectSingleNode("name").InnerText);
    print(friendList[i].SelectSingleNode("age").InnerText);
}

存储操作

// 第一步:决定存储位置
string path = Application.persistentDataPath + "/PlayerInfo2.xml";

// 第二步:存储XML文件
XmlDocument xml = new XmlDocument();

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

// 添加根节点
XmlElement root = xml.CreateElement("Root");
xml.AppendChild(root);

// 添加子节点(单个)
XmlElement name = xml.CreateElement("name");
name.InnerText = "Unity小张";
root.AppendChild(name);

// 添加多个子节点
XmlElement listInt = xml.CreateElement("listInt");
for(int i = 0; i < 3; i++)
{
    XmlElement childNode = xml.CreateElement("int");
    childNode.InnerText = i.ToString();
    listInt.AppendChild(childNode);
}
root.AppendChild(listInt);

// 添加属性
XmlElement item = xml.CreateElement("Item");
item.SetAttribute("id", "1");
item.SetAttribute("num", "10");
root.AppendChild(item);

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

修改操作

// 第一步:判断文件是否存在
if(File.Exists(path))
{
    XmlDocument newXml = new XmlDocument();
    newXml.Load(path);
    
    // 第二步:修改数据
    // 获取子节点(两种写法)
    XmlNode node = newXml.SelectSingleNode("Root").SelectSingleNode("atk");
    // 简洁写法
    node = newXml.SelectSingleNode("Root/atk");  
    
    // 获取父节点
    XmlNode root2 = newXml.SelectSingleNode("Root");
    
    // 移除子节点
    root2.RemoveChild(node);
    
    // 添加新节点
    XmlElement speed = newXml.CreateElement("speed");
    speed.InnerText = "100";
    root2.AppendChild(speed);
    
    // 第三步:保存修改
    newXml.Save(path);
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值