XML文件的解析类似游戏中配置文件的更改。在程序外部就可以更改程序运行模式。好了,上代码,这是解析xml的通用类。
using System.Collections.Generic;
using System.IO;
using System.Xml;
using UnityEngine;
/// <summary>
/// 读取配置文件
/// </summary>
public class LoadXml{
public static string xmlPath = Application.streamingAssetsPath + "/Id.config";
public static readonly object _lockHelper = new object();
public static XmlDocument _xml = new XmlDocument();
public static void Open()
{
if (File.Exists(xmlPath))
{
_xml.Load(xmlPath);
//Debug.Log("open id.config successful");
}
}
public static List<string> returnValue()
{
lock (_lockHelper)
{
Open();
XmlNode id = _xml.SelectSingleNode("/root/ID");
List<string> valueList = new List<string>();
foreach (XmlNode xl in id.ChildNodes)
{
valueList.Add(xl.InnerText);
//Debug.Log(xl.InnerText);
}
return valueList;
}
}
public static string getValue(string s)
{
lock (_lockHelper)
{
Open();
s = "/root/" + s.Replace(".", "/");
XmlNode id = _xml.SelectSingleNode(s);
Debug.Log(id.InnerText.Trim());
return id.InnerText.Trim();
}
}
public static Dictionary<string, string> returnHRZParameter()
{
lock (_lockHelper)
{
Open();
XmlNode hrzId = _xml.SelectSingleNode("/root/HRZID");
//Debug.Log(hrzId.ChildNodes.Count);
Dictionary<string, string> parameterDic = new Dictionary<string, string>();
if (hrzId.ChildNodes.Count>0)
{
foreach (XmlNode parameter in hrzId.ChildNodes)
{
XmlElement _parameter = (XmlElement)parameter;
if (parameterDic.ContainsKey(_parameter.GetAttribute("name").Trim()))
{
Debug.LogError(_parameter.GetAttribute("name").Trim());
return null;
}
if (!Globle.IsExcute)
{
Globle.IsExcute = true;
Globle.IdValue = _parameter.GetAttribute("id").Trim();
}
parameterDic.Add(_parameter.GetAttribute("name").Trim(), _parameter.GetAttribute("id").Trim());
}
return parameterDic;
}
return null;
}
}
}
对应的配置文件格式如下:
希望对你有帮助。双击评论666哈哈
2018.12.19更
今天遇到一个需求,是解析XML字符串。样式如下:
<?xml version="1.0" encoding="utf-8"?>
<string xmlns="http://tempuri.org/">5496sad</string>
刚开始我以为就是按照解析xml文件那样正常解析就可以。但是出现问题了,在这一步出现报空。所以应该是没有找到这个string Node。
纠结了好久找寻原因,最后发现是因为该xml字符串没有像xml文件那样有标准的头,所以无法被正常解析出来。所以使用了其他的方法。如下:
_xml.LoadXml(str);//加载数据
//XmlNode //GetElementsByTagName 返回匹配的元素节点及它们的子节点的 NodeList。
string code = _xml.GetElementsByTagName("string")[0].InnerXml;
Debug.Log(code);
下面是解析XML格式字符串的帮助类。
using UnityEngine;
using System.Collections;
using System.Xml;
using System;
using System.IO;
using System.Data;
using System.Xml.Serialization;
/// <summary>
/// Xml序列化与反序列化
/// </summary>
public class XmlUtil
{
/// <summary>
/// 将xml转换成datatable
/// </summary>
/// <returns>The to data table.</returns>
/// <param name="Data">Data.</param>
public static DataTable XmlToDataTable(string XmlString)
{
try
{
StringReader strignReader = new StringReader(XmlString);
XmlTextReader reader = new XmlTextReader(strignReader);
DataSet ds = new DataSet();
ds.ReadXml(reader);
return ds.Tables[0];
}
catch
{
return null;
}
}
public static int XmlToInt(string XmlString)
{
try
{
XmlDocument xml = new XmlDocument ();
xml.LoadXml (XmlString);
XmlNodeList nodes = xml.GetElementsByTagName ("int");
return int.Parse(nodes[0].InnerXml);
}
catch
{
return -5;
}
}
public static bool XmlToBool(string XmlString)
{
try
{
XmlDocument xml = new XmlDocument ();
xml.LoadXml (XmlString);
XmlNodeList nodes = xml.GetElementsByTagName ("boolean");
return bool.Parse(nodes[0].InnerXml);
}
catch
{
return false;
}
}
public static string XmlToString(string XmlString)
{
try
{
XmlDocument xml = new XmlDocument();
xml.LoadXml(XmlString);
XmlNodeList nodes = xml.GetElementsByTagName("string");
return nodes[0].InnerXml;
}
catch
{
return "";
}
}
}
2019.7.9更
有的时候我们不能从本地加载配置文件,如发布web版。我们只能通过www加载到配置文本信息,然后反序列化成我们要的对象。将字符反序列化成对象代码如下:
using UnityEngine;
using System.Collections;
using System;
using System.IO;
using System.Text;
using System.Xml;
using System.Xml.Serialization;
public static class XMLTools {
public delegate void callBackXml(System.Object obj);
/// <summary>
/// 把XML数据弄成对象
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="s"></param>
/// <returns></returns>
public static T getXmlInfo<T>(string s) {
T rs = default(T);
XmlSerializer mySerializer = new XmlSerializer(typeof(T));
try
{
StringReader r = new StringReader(s);
rs = (T)mySerializer.Deserialize(r);
}
catch (Exception err)
{
//Debug.Log(err.Message);
}
return rs;
}
}
T是根据我们设计的配置文件表创建的对应类。