Unity3D开发之XML解析

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是根据我们设计的配置文件表创建的对应类。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值