zoukankan      html  css  js  c++  java
  • 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+="	";
                }
                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测试,本人的手机哦:

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

  • 相关阅读:
    FreeRTOS 动态内存管理
    NODE.JS之我见
    Maven使用详解
    WPF依赖属性详解
    对比MFC资源文件谈谈WPF布局方式
    MAPPING SEGMENTS TO PAGES
    只用一行代码让你的ASP.NET MVC 跑起来
    WPF The Hard Way
    Java判断回文数算法简单实现
    2014让我受益最大的那些书--别找了,都在这里
  • 原文地址:https://www.cnblogs.com/wuzhang/p/wuzhang20140731.html
Copyright © 2011-2022 走看看