22_解析XML配置文件_List列表
解析XML文件 需要先
1.【加载XML文件】
而 【加载XML】文件有两种方式
【第一种 —— 使用Unity资源系统加载文件】
TextAsset xml = Resources.Load<TextAsset>(filePath);
XmlDocument doc = new XmlDocument();
doc.LoadXml(xml.text);
【第二种 —— 在C#文件IO接口加载文件】
XmlDocument doc = new XmlDocument();
doc.Load(@"D:\Dec\info.xml");
2.【解析XML文件】 分三步
(1)第一步 - 获取根节点下的所有子节点的List
XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;
(2)第二步 - 将某一个节点转化为一个XmlElement
XmlElement ele = nodLst[i] as XmlElement;
(3)从XmlElement里获取名称为"ID"的数据
string value = ele.GetAttributeNode("ID").InnerText;
注意:数据都是以字符串的形式存储 需要自己转化为对应的数据类型
因为 配置文件本身就是一种资源
所以在资源加载服务层ResSvc.cs解析使用
这里我们需要创建一个XML配置文件常量类来记录不同的XML文件的名称
编写脚本
//功能 : 路径常量宣言
public class PathDefine {
public const string RDNameCfg = "ResCfgs/rdname";
}
其中路径名称要一致
在资源加载服务ResSvc.cs中填好加载的文件路径
如果XML文件可能加载失败时会导致程序崩溃 所以加一层判断
如果加载成功了那么 就解析这个文件
先创建一个XML文件 然后加载xml文件中的text信息 然后开始解析XML文件
其中这个root是配置文件中的头节点
获取了这个配置文件的子节点 就可以进行遍历 并获取ID号
因为获取的这个ID号可以判断这个配置文件加载是否成功
所以加一层判断
如果这个ID号不存在 后面就不需要读了就 跳过
接着如果拿到了这个ID号就遍历这个节点里面的属性
比如说拿到了ID = 1 的节点就遍历里面的属性
然后将定义三个姓氏、男名、女名列表 然后遍历ID号的属性 将这些属性分别存储到这三个列表中
using System;
using System.Collections.Generic;
using System.Xml;
using UnityEngine;
using UnityEngine.SceneManagement; //异步加载 命名空间
//功能 : 资源加载服务
public class ResSvc : MonoBehaviour{
#region 单例模式
public static ResSvc Instance = null;
#endregion
public void InitSvc(){
#region 单例模式
Instance = this;
#endregion
#region InitCfgs-XML配置文件
InitRDNameCfg();
#endregion
Debug.Log("Init ResSvc...");
}
#region 【委托】更新回调 进度值
Action prgCB = null;
#endregion
//自定义异步加载
public void AsyncLoadScene(string sceneName,Action loaded) {
#region 窗口基类的好处
GameRoot.Instance.loadingWnd.SetWndState();
#endregion
//拿到异步操作
AsyncOperation sceneAsync = SceneManager.LoadSceneAsync(sceneName);
#region 【委托】更新回调 进度值
//Lamd表达式
prgCB = () =>{
//当前加载进度
float val = sceneAsync.progress;
GameRoot.Instance.loadingWnd.SetProgress(val);
if (val == 1){
#region Loaded回调判断
if (loaded != null)
loaded();
#endregion
#region 单例调用打开登录窗口
//LoginSys.Instance.OpenLoginWnd();
#endregion
//当进度满后 进度值 置空
prgCB = null;
sceneAsync = null;
GameRoot.Instance.loadingWnd.gameObject.SetActive(false);
}
};
#endregion
}
#region 【委托】更新回调 进度值
void Update(){
if(prgCB != null)
prgCB();
}
#endregion
#region 音乐播放资源_字典
Dictionary<string,AudioClip> adDic = new Dictionary<string,AudioClip>();
public AudioClip LoadAudio(string path, bool cache = false) {
AudioClip au = null;
//检查路径是否存在 需要对资源进行加载
//out的作用是 如果路径已经存在这个资源 那么out直接就返回了
if (!adDic.TryGetValue(path, out au)) {
au = Resources.Load<AudioClip>(path);
//检查是否需要缓存 避免重复加载
if (cache) {
adDic.Add(path, au);
}
}
return au;
}
#endregion
#region InitCfgs-XML配置文件
#region 遍历属性 - 定义
//存储姓氏的列表 定义
List<string> surnameLst = new List<string>();
//男人名字的列表 定义
List<string> manLst = new List<string>();
//女人名字的列表 定义
List<string> womanLst = new List<string>();
#endregion
void InitRDNameCfg() {
//1.加载XML文件
TextAsset xml = Resources.Load<TextAsset>(PathDefine.RDNameCfg);
if (!xml){
Debug.LogError("xml file:" + PathDefine.RDNameCfg + "not exist");
}
else {
//1.获取XML文件
//创建XML配置文件
XmlDocument doc = new XmlDocument();
//加载获取xml文件的文本信息
doc.LoadXml(xml.text);
//2.解析XML文件 - (1)获取根节点下的所有子节点的List
XmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;
//遍历子节点
for (int i = 0; i < nodLst.Count; i++){
// - (2)将某一个节点转化为一个XmlElement
XmlElement ele = nodLst[i] as XmlElement;
if (ele.GetAttributeNode("ID") == null) {
continue;
}
//获取ID号 - (3)从XmlElement里获取名称为"ID"的数据
int ID = Convert.ToInt32(ele.GetAttributeNode("ID").InnerText);
#region 遍历属性
foreach (XmlElement e in nodLst[i].ChildNodes) {
switch (e.Name) {
case "surname":
//增加值
surnameLst.Add(e.InnerText);
break;
case "man":
//增加值
manLst.Add(e.InnerText);
break;
case "woman":
//增加值
womanLst.Add(e.InnerText);
break;
}
}
#endregion
}
}
}
#endregion
}
这样这个XML配置文件 就解析完成了
End.