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文件的名称

编写脚本

cs 复制代码
//功能 : 路径常量宣言
public class PathDefine {
    public const string RDNameCfg = "ResCfgs/rdname";
}

其中路径名称要一致

在资源加载服务ResSvc.cs中填好加载的文件路径

如果XML文件可能加载失败时会导致程序崩溃 所以加一层判断

如果加载成功了那么 就解析这个文件

先创建一个XML文件 然后加载xml文件中的text信息 然后开始解析XML文件

其中这个root是配置文件中的头节点

获取了这个配置文件的子节点 就可以进行遍历 并获取ID号

因为获取的这个ID号可以判断这个配置文件加载是否成功

所以加一层判断

如果这个ID号不存在 后面就不需要读了就 跳过

接着如果拿到了这个ID号就遍历这个节点里面的属性

比如说拿到了ID = 1 的节点就遍历里面的属性

然后将定义三个姓氏、男名、女名列表 然后遍历ID号的属性 将这些属性分别存储到这三个列表中

cs 复制代码
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.

相关推荐
2401_877274247 小时前
vector、list、deque的差异
数据结构·list
L X..7 小时前
Unity反射调用 ReactiveProperty<T>(泛型类型)内部方法时崩溃
unity·c#·游戏引擎·.net
缺点内向10 小时前
C# 中 Excel 工作表打印前页面边距的设置方法
c#·.net·excel
艾莉丝努力练剑12 小时前
【C++STL :list类 (二) 】list vs vector:终极对决与迭代器深度解析 && 揭秘list迭代器的陷阱与精髓
linux·开发语言·数据结构·c++·list
雪芽蓝域zzs18 小时前
uniapp AES 加密解密
开发语言·uni-app·c#
weixin_456904271 天前
C# 中的回调函数
java·前端·c#
千忧散1 天前
Unity Socket学习笔记 (三)TCP&UDP
笔记·学习·unity·c#
君莫愁。1 天前
【Unity】构建超实用的有限状态机管理类
unity·c#·游戏引擎·有限状态机
WangMing_X1 天前
《使用模块化分层来达到企业级项目要求》
开发语言·c#
c#上位机1 天前
wpf之ToggleButton控件
c#·wpf