当前位置: 首页 > article >正文

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.


http://www.kler.cn/a/518043.html

相关文章:

  • Java后端之AOP
  • 一文讲解Java中的接口和抽象类
  • 【leetcode100】从前序与中序遍历序列构造二叉树
  • 算法每日双题精讲 —— 二分查找(寻找旋转排序数组中的最小值,点名)
  • 引领产品创新: 2025 年 PM 效能倍增法则
  • Linux Futex学习笔记
  • eniops库中pack函数使用方法
  • Python数据分析-pandas入门(五)
  • LosslessCut:一款强大的音视频无损剪辑工具
  • 【深度学习】常见模型-生成对抗网络(Generative Adversarial Network, GAN)
  • 【优选算法】10----无重复字符的最长子串
  • Vue.js组件开发-如何实现带有搜索功能的下拉框
  • CASAIM与友达光电达成深度合作,CASAIM IS自动化蓝光测量技术为创新显示技术发展注入新的活力
  • Poetry shell --> poetry-plugin-shell
  • Hnu电子电路实验4
  • 基于数智立体化V2.0体系构建医疗综合智能体:理论、实践与展望
  • C语言内存管理详解
  • LKT4304新一代算法移植加密芯片,守护 物联网设备和云服务安全
  • leetcode——最大子数组和(java)
  • 15.7k!DISM++一款快捷的系统优化工具
  • 使用RocketMQ 的业务系统怎么处理消息的积压?
  • kafka-保姆级配置说明(broker)
  • 计算机视觉-卷积
  • Qt调用ffmpeg库实现简易视频播放器示例
  • 嵌入式音视频开发——视频篇(三)
  • 如何在Linux中找到MySQL的安装目录