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
}
Unity 解析XML通过字段查找数值
猜你喜欢
转载自blog.csdn.net/yzx5452830/article/details/79787474
今日推荐
周排行