Unity 解析XML通过字段查找数值

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System.Xml;

public class XmlManager : MonoBehaviour
{

    /// <summary>
    /// 表头
    /// </summary>
    public const string xmlRoot = "FZW_MASK_XML_TABLE";

    //XML文件夹名字
    private const string foldertableTop = "/XMLTable/";

    //关卡XML表地址
    private string levelXMLPath;
    //怪物XML表地址
    private string enemyXMLPath;
    
    //不同平台的路径
    private static string path;
    
    //xml列表
    public static List<XmlElement> XmlNodeLevel = new List<XmlElement>();
    public static List<XmlElement> XmlNodeEnemy = new List<XmlElement>();


    void Awake()
    {
        //赋值关卡xml名字
        levelXMLPath = foldertableTop + "52001.xml";
        //怪物表名
        enemyXMLPath = foldertableTop + "Enemy.xml";

        //加载表
        //关卡
        StartCoroutine(LoadTable(levelXMLPath, XmlNodeLevel));
        //怪物
        StartCoroutine(LoadTable(enemyXMLPath, XmlNodeEnemy));

        //TODO 以上根据自己的XML文件位置和文件名自己设置 
        //TODO 调用方法为  
        //                                      要查找的ID  "字段"  "表头"   //存储的List<XmlElement>
        //int enemyID = XmlManager.FindXmlInt(1001, "EnemyID", "CreateEnemy", XmlManager.XmlNodeLevel);

    }


    #region  加载本地文件夹XML储存在内存里



    /// <summary>
    /// 获取本地XML解析XML
    /// </summary>
    /// <param tableTop="path"></param>
    /// <returns></returns>
    IEnumerator LoadTable(string path,List<XmlElement> xmlElements)
    {
        if (Application.platform == RuntimePlatform.Android || Application.platform == RuntimePlatform.IPhonePlayer)
        {
            //在Android中实例化WWW不能在路径前面加"file://"
            path = Application.streamingAssetsPath + path; 
        }
        else
        {
            //在Windows中实例化WWW必须要在路径前面加"file://"
            path = "file://" + Application.streamingAssetsPath + path;
        }
        WWW www = new WWW(path);
        while (!www.isDone)
        {
            yield return www;
            ParseXml(www, xmlElements);
        }
    }
    /// <summary>
    /// 储存XML
    /// </summary>
    /// <param tableTop="www"></param>
    private void ParseXml(WWW www, List<XmlElement> xmlElements)
    {
        XmlDocument xmlDoc = new XmlDocument();
        xmlDoc.LoadXml(www.text);
        XmlNodeList nodeList = xmlDoc.SelectSingleNode(xmlRoot).ChildNodes;
        foreach (XmlElement node in nodeList)
        {
            xmlElements.Add(node);
        }
    }
    #endregion

    #region  解析XML表格 返回指定值


    /// <summary>
    /// 读取表有多少行
    /// </summary>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">表</param>
    /// <returns></returns>
    public static int GetXmlRows(string tableTop, List<XmlElement> xmlNdelist)
    {
        int sum = 0;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            if (xe.Name == tableTop && xe.GetAttribute("ID") != null)
            {
                sum++;
            }
        }
        return sum;
    }

    /// <summary>
    /// 获取表的ID数组
    /// </summary>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">表</param>
    /// <returns></returns>
    public static int[] GetXmlIDArray(string tableTop, List<XmlElement> xmlNdelist)
    {
        int rows = GetXmlRows(tableTop, xmlNdelist);  //TODO xmlNdelist.Count 
        int[] idArr = new int[rows];

        for (int i = 0; i < xmlNdelist.Count; i++)
        {
            if (xmlNdelist[i].Name == tableTop&& xmlNdelist[i].GetAttribute("ID") != null)
            {
                idArr[i] = int.Parse(xmlNdelist[i].GetAttribute("ID"));
            }
        }
        //Debug.Log(xmlNdelist.Count   + "  COUNT");
        return idArr;
    }



    /// <summary>
    /// 读取XML 返回float
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static float FindXmlFloat(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        float wen = 0;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                wen = float.Parse(xe.SelectSingleNode(type).InnerText);
            }
        }
        return wen;
    }

    /// <summary>
    /// 读取XML 返回int
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static int FindXmlInt(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        int wen = 0;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                wen = int.Parse(xe.SelectSingleNode(type).InnerText);
            }
        }
        return wen;
    }

    /// <summary>
    /// 读取XML 返回字符串
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static string FindXmlString(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string wen = "";
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                wen = xe.SelectSingleNode(type).InnerText;
            }
        }
        return wen;
    }

    /// <summary>
    /// 读取XML 返回int数组
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static int[] FindXmlIntArray(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string str = "";
        string[] strArr;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                str = xe.SelectSingleNode(type).InnerText;
            }
        }
        //字符串切割 得到一个数组
        strArr = str.Split(';');
        //数组转化
        int[] wenArr = new int[strArr.Length];
        for (int i = 0; i < wenArr.Length; i++)
        {
            wenArr[i] = int.Parse(strArr[i]);
        }

        return wenArr;
    }

    /// <summary>
    /// 读取XML 返回Float数组
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static float[] FindXmlFloatArray(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string str = "";
        string[] strArr;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                str = xe.SelectSingleNode(type).InnerText;
            }
        }
        //字符串切割 得到一个数组
        strArr = str.Split(';');
        //数组转化
        float[] wenArr = new float[strArr.Length];
        for (int i = 0; i < wenArr.Length; i++)
        {
            wenArr[i] = float.Parse(strArr[i]);
        }

        return wenArr;
    }

    /// <summary>
    /// 读取XML 返回String数组
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static string[] FindXmlStringArray(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string str = "";
        string[] strArr;
        //如果子节点名称为CharacterTemplateData,并且id属性=0
        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                str = xe.SelectSingleNode(type).InnerText;
            }
        }
        //字符串切割 得到一个数组
        strArr = str.Split(';');
        return strArr;
    }

    /// <summary>
    /// 读取XML 返回Vector2数组
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static Vector2[] FindXmlVector2(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string str = "";
        string[] strArr;
        string[] v2Arr;
        Vector2[] v2;
        int inxed = 0;
        List<string[]> strList = new List<string[]>();

        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                str = xe.SelectSingleNode(type).InnerText;
            }
        }

        strArr = str.Split('*');
        v2 = new Vector2[strArr.Length];

        for (int i = 0; i < strArr.Length; i++)
        {
            v2Arr = strArr[i].Split(';');
            strList.Add(v2Arr);
        }

        foreach (string[] stri in strList)
        {
            v2[inxed].x = int.Parse(stri[0]);
            v2[inxed].y = int.Parse(stri[1]);
            inxed++;
        }
        strList.Clear();
        return v2;
    }

    /// <summary>
    /// 读取XML 返回Vector3数组
    /// </summary>
    /// <param name="id">ID</param>
    /// <param name="type">字段</param>
    /// <param name="tableTop">表头</param>
    /// <param name="xmlNdelist">XmlElement</param>
    /// <returns></returns>
    public static Vector3[] FindXmlVector3(int id, string type, string tableTop, List<XmlElement> xmlNdelist)
    {
        string str = "";
        string[] strArr;
        string[] v3Arr;
        Vector3[] v3;
        int inxed = 0;
        List<string[]> strList = new List<string[]>();

        foreach (XmlElement xe in xmlNdelist)
        {
            //print("进入判断");
            //---------------------------------------------------------
            if (xe.Name == tableTop && xe.GetAttribute("ID") == id.ToString())
            {
                //print("进入获取值");
                str = xe.SelectSingleNode(type).InnerText;
            }
        }

        strArr = str.Split('*');
        v3 = new Vector3[strArr.Length];

        for (int i = 0; i < strArr.Length; i++)
        {
            v3Arr = strArr[i].Split(';');
            strList.Add(v3Arr);
        }

        foreach (string[] stri in strList)
        {
            v3[inxed].x = int.Parse(stri[0]);
            v3[inxed].y = int.Parse(stri[1]);
            v3[inxed].z = int.Parse(stri[2]);
            inxed++;
        }
        strList.Clear();
        return v3;
    }

    #endregion

}

发布了40 篇原创文章 · 获赞 36 · 访问量 21万+

猜你喜欢

转载自blog.csdn.net/yzx5452830/article/details/79787474