解析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;#endregionpublic void InitSvc(){#region 单例模式Instance = this;#endregion#region InitCfgs-XML配置文件InitRDNameCfg();#endregionDebug.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>();#endregionvoid 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)获取根节点下的所有子节点的ListXmlNodeList nodLst = doc.SelectSingleNode("root").ChildNodes;//遍历子节点for (int i = 0; i < nodLst.Count; i++){// - (2)将某一个节点转化为一个XmlElementXmlElement 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.