Unity数据持久化
三、XML数据持久化
3.2 C#中的XML处理
3.2.1 XmlDocument基础概念
XmlDocument类:
- Unity中使用
System.Xml.XmlDocument
类来处理XML文档 - 提供了完整的XML文档操作功能
- 支持读取、修改、创建XML文档
核心功能:
- Load方法:从文件或字符串加载XML文档
- SelectSingleNode:选择单个节点
- SelectNodes:选择多个节点
- InnerText:获取节点的文本内容
- Attributes:获取节点的属性集合
3.2.2 XML文件加载方法
1. 从文件路径加载
csharp
// 方法1:从指定路径加载XML文件
XmlDocument xmlDocument = new XmlDocument();
xmlDocument.Load("Assets/StreamingAssets/PlayerInfo.xml");
2. 从字符串加载
csharp
// 方法2:从字符串加载XML内容
TextAsset textAsset = Resources.Load<TextAsset>("PlayerInfo");
xmlDocument.LoadXml(textAsset.text);
加载方式对比:
加载方式 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
Load(string path) | 文件路径已知 | 直接加载文件 | 路径依赖性强 |
LoadXml(string xml) | 字符串内容 | 灵活性高 | 需要先获取字符串 |
3.2.3 XML节点访问方法
1. 获取根节点
csharp
// 获取XML文档的根节点
XmlNode root = xmlDocument.SelectSingleNode("PlayerInfo");
2. 获取子节点
csharp
// 通过根节点获取子节点
XmlNode node = root.SelectSingleNode("name");
print(node.InnerText); // 输出节点的文本内容
3. 获取属性信息
csharp
// 获取节点的属性信息
XmlNode weapon = root.SelectSingleNode("weapon");
print(weapon.Attributes["id"].Value); // 输出id属性的值
print(weapon.Attributes.GetNamedItem("num").Value); // 输出num属性的值
4. 获取多个同名节点
csharp
// 获取所有名为"Friend"的节点
XmlNodeList nodeList = root.SelectNodes("Friend");
foreach(XmlNode nd in nodeList)
{
print(nd.SelectSingleNode("name").InnerText);
print(nd.SelectSingleNode("age").InnerText);
}
// 使用索引访问节点列表
for(int i = 0; i < nodeList.Count; i++)
{
print(nodeList[i].SelectSingleNode("name").InnerText);
print(nodeList[i].SelectSingleNode("age").InnerText);
}
3.2.4 完整的XML处理示例
XML文件结构示例:
xml
<?xml version="1.0" encoding="UTF-8"?>
<PlayerInfo>
<name>张三</name>
<age>25</age>
<weapon id="001" num="5">剑</weapon>
<Friend>
<name>李四</name>
<age>23</age>
</Friend>
<Friend>
<name>王五</name>
<age>27</age>
</Friend>
</PlayerInfo>
完整的XML处理代码:
csharp
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;
/// <summary>
/// XML数据处理示例类
/// 演示如何使用XmlDocument读取和解析XML文件
/// </summary>
public class Xmltext : MonoBehaviour
{
// 用于存储从Resources加载的文本资源
TextAsset textAsset;
void Start()
{
// === XML文档加载方法 ===
// 方法1:利用XmlDocument.Load(string path)加载指定路径的xml文件
// 适用于文件路径已知的情况,如StreamingAssets文件夹中的XML文件
XmlDocument xmlDocument1 = new XmlDocument();
xmlDocument1.Load("Assets/StreamingAssets/PlayerInfo.xml");
// 方法2:利用XmlDocument.LoadXml(string xml)加载指定字符串的xml文件
// 适用于从Resources文件夹加载TextAsset资源的情况
textAsset = Resources.Load<TextAsset>("PlayerInfo");
XmlDocument xmlDocument2 = new XmlDocument();
xmlDocument2.LoadXml(textAsset.text);
// === XML节点访问示例 ===
// 获取根节点:使用SelectSingleNode方法选择单个节点
XmlNode root = xmlDocument2.SelectSingleNode("PlayerInfo");
// 通过根节点获取子节点:读取元素节点的文本内容
XmlNode nameNode = root.SelectSingleNode("name");
print("玩家姓名: " + nameNode.InnerText); // 输出节点的文本内容
// === 属性信息读取 ===
// 获取带属性的节点
XmlNode weaponNode = root.SelectSingleNode("weapon");
// 方法1:通过属性名直接访问属性值
print("武器ID: " + weaponNode.Attributes["id"].Value);
// 方法2:通过GetNamedItem方法获取指定名称的属性
print("武器数量: " + weaponNode.Attributes.GetNamedItem("num").Value);
// === 多个同名节点处理 ===
// 获取所有名为"Friend"的节点列表
XmlNodeList friendList = root.SelectNodes("Friend");
// 方法1:使用foreach循环遍历节点列表
print("=== 使用foreach遍历朋友列表 ===");
foreach(XmlNode friendNode in friendList)
{
// 获取每个朋友节点的子节点信息
string friendName = friendNode.SelectSingleNode("name").InnerText;
string friendAge = friendNode.SelectSingleNode("age").InnerText;
print("朋友姓名: " + friendName + ", 年龄: " + friendAge);
}
// 方法2:使用for循环和索引访问节点列表
print("=== 使用for循环遍历朋友列表 ===");
for(int i = 0; i < friendList.Count; i++)
{
// 通过索引访问节点列表中的元素
XmlNode currentFriend = friendList[i];
string friendName = currentFriend.SelectSingleNode("name").InnerText;
string friendAge = currentFriend.SelectSingleNode("age").InnerText;
print("朋友" + (i + 1) + " - 姓名: " + friendName + ", 年龄: " + friendAge);
}
}
}
3.2.5 XML处理的核心知识点
1. XmlDocument的主要方法
方法 | 功能 | 参数说明 |
---|---|---|
Load(string path) | 从文件路径加载XML | path:XML文件路径 |
LoadXml(string xml) | 从字符串加载XML | xml:XML字符串内容 |
SelectSingleNode(string xpath) | 选择单个节点 | xpath:XPath表达式 |
SelectNodes(string xpath) | 选择多个节点 | xpath:XPath表达式 |
2. XmlNode的主要属性
属性 | 功能 | 返回值 |
---|---|---|
InnerText | 获取节点的文本内容 | string |
Attributes | 获取节点的属性集合 | XmlAttributeCollection |
ChildNodes | 获取子节点集合 | XmlNodeList |
Name | 获取节点名称 | string |
3. 属性访问方法
方法 | 功能 | 示例 |
---|---|---|
Attributes["属性名"] | 直接通过属性名访问 | node.Attributes["id"] |
GetNamedItem("属性名") | 通过方法获取属性 | node.Attributes.GetNamedItem("num") |
Value | 获取属性值 | node.Attributes["id"].Value |
4. 节点遍历方法
方法 | 适用场景 | 优点 | 缺点 |
---|---|---|---|
foreach循环 | 简单遍历 | 代码简洁 | 无法获取索引 |
for循环 | 需要索引 | 可以获取位置信息 | 代码稍复杂 |
通过合理使用XML数据持久化,可以为Unity项目提供灵活、可读性强的数据存储解决方案,特别适合需要频繁修改和跨平台使用的配置数据。