首页 > 代码库 > unity Android 打包后读取 xml 文件

unity Android 打包后读取 xml 文件

问题:    前天在做东西的过程中发现了一个让人很纠结的问题,为什么Unity 程序在PC上测试一点都没问题但是打包发布到Android后却无法读取XML文件。

通过查找自资料发现打包发不到安卓后的路径和PC上测试时的路径发生了变化,因此读取就出bug了。

那么解决方法很简单:

1,建立一个新工程

2,添加两个GUItext组件一个用于显示测试平台另一个用于显示读取到的XML数据,

如下:

3,该贴代码了

 

//------------------------------------------------------------------------------// <auto-generated>//     此代码由工具生成。//     运行时版本:4.0.30319.18063////     对此文件的更改可能会导致不正确的行为,并且如果//     重新生成代码,这些更改将会丢失。// </auto-generated>//------------------------------------------------------------------------------using System;using UnityEngine;using System.IO;using System.Xml;using System.Linq;using System.Text;using System.Collections;using System.Collections.Generic;namespace AssemblyCSharp1{        public class AddressData1    {        public string timeURL;        public static string all;        public static string hp;                public static string speed;        public static string demage;                public static string localPath;        public static string id;        public static string score;        public static List<int> allScore;        public void AddressData ()        {            Debug.Log (localPath);        }        public static List<int> getAllScore()        {            return allScore;        }        /// <summary>        /// 获取XML路径        /// </summary>        /// <returns>The XM.</returns>        public static IEnumerator GetXML()        {            if(Application.platform==RuntimePlatform.Android)            {                localPath = Application.streamingAssetsPath+"/score.xml"; //在Android中实例化WWW不能在路径前面加"file://"                Debug.Log (localPath);            }            else            {                localPath = "file://"+UnityEngine.Application.streamingAssetsPath + "/score.xml";//在Windows中实例化WWW必须要在路径前面加"file://"                                Debug.Log (localPath);            }            WWW www = new WWW(localPath);            while (!www.isDone)            {                Debug.Log("Getting GetXML");                yield return www;                all = www.text;                ParseXml(www);            }        }                /// <summary>        ///按属性获取节点        /// </summary>        /// <param name="www">Www.</param>        public static void ParseXml(WWW www)         {            if(allScore == null)            {                allScore =new List<int>();            }            XmlDocument xmlDoc = new XmlDocument();            xmlDoc.LoadXml(www.text);            XmlNodeList nodeList=xmlDoc.SelectSingleNode("rank").ChildNodes;                        foreach(XmlElement xe in nodeList)            {                id = xe.GetAttribute("id");                score = xe.GetAttribute("score");                allScore.Add(int.Parse(score));  //将所有得分读入List                Debug.Log ("ID:"+id+" Score:"+score);            }            allScore.Sort();            allScore.Reverse();            foreach(var score in allScore )            {                Debug.Log (score.ToString());            }        }                /// <summary>        /// 读取xml内容        /// </summary>        public static IEnumerator load()        {            string url = string.Empty;            string path = string.Empty;            string line1 = string.Empty;            if(Application.platform==RuntimePlatform.Android)            {                url=Application.streamingAssetsPath+"/hp.xml"; //在Android中实例化WWW不能在路径前面加"file://"                                WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用                yield return wWA;                 line1=wWA.text;                Debug.Log (line1);            }            else            {                url="file://"+Application.streamingAssetsPath+"/hp.xml";//在Windows中实例化WWW必须要在路径前面加"file://"                WWW wWA=new WWW("file://"+url);                yield return wWA;                 line1=wWA.text;                Debug.Log (line1);            }            yield return null;        }        /// <summary>        /// 加载xml文档        /// </summary>        /// <returns></returns>        public static  XmlDocument ReadAndLoadXml()        {            XmlDocument doc = new XmlDocument();            //Debug.Log("加载xml文档");            doc.Load(localPath);            return doc;        }        /// <summary>        /// 增加节点        /// </summary>        /// <returns>The node.</returns>        /// <param name="score">Score.</param>        public static void insertNode(int score)        {            int minute=int.Parse((System.DateTime.Now.Minute.ToString()));            string order = System.DateTime.Now.Hour+""+System.DateTime.Now.Minute+""+System.DateTime.Now.Second;            XmlDocument xmlDoc=new XmlDocument();            xmlDoc.Load(Application.dataPath + "/StreamingAssets/score.xml");            XmlNode root=xmlDoc.SelectSingleNode("rank");                        XmlElement xel=xmlDoc.CreateElement("rank");    //建立节点            xel.SetAttribute("id",order);            xel.SetAttribute("score",score.ToString());                        root.AppendChild(xel);            xmlDoc.Save(Application.dataPath + "/StreamingAssets/score.xml");            return;        }    }}

测试读取数据代码:

using UnityEngine;using System.Collections;using AssemblyCSharp1;public class testinsert : MonoBehaviour {    public GUIText guitext;    public GUIText platform;    string allscores="";    void Awake()    {        if(Application.platform==RuntimePlatform.Android)        {            platform.text = "Android";        }        else        {            platform.text = "PC";        }    }    // Use this for initialization    void Start ()     {        StartCoroutine(AddressData1.GetXML());        //AddressData1.insertNode(22);    }    void OnGUI()    {        if(GUI.Button(new Rect(100,100,40,40),"load"))        {            foreach(int score in AddressData1.allScore)            {                allscores+=score.ToString();                guitext.text+="\t";            }            guitext.text = allscores;        }    }    // Update is called once per frame    void Update ()     {        }}

XML文件:
score.xml

<?xml version="1.0" encoding="UTF-8" ?><rank>    <rank id="5618" score="12" ></rank>    <rank id="1712" score="14" ></rank></rank>

那下面鸡冻的时刻来了:
PC端 运行前:

运行后:

 

点击load按钮:

看看控制台都输出哪些内容了:

PC上测试Ok了吧。

接下来Android测试,本人的手机哦:

到此结束了,以后程序关于数据处理的都是浮云了!