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测试,本人的手机哦:

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

unity Android 打包后读取 xml 文件

时间: 2024-10-23 17:53:02

unity Android 打包后读取 xml 文件的相关文章

android读取xml文件来实现省份,城市,区的选择

本博客如需转载.请注明出处. --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- 今天要实现省份,城市.区的选择,到网络上百度了一下.发

Android 5.0 system_fonts.xml文件的解析过程

Android 5.0 system_fonts.xml文件的解析过程 首先看看看5.0 中familyset version="22" 的格式 20 <family name="sans-serif"> 21 <font weight="100" style="normal">Roboto-Thin.ttf</font> 22 <font weight="100"

C#中常用的几种读取XML文件的方法

XML文件是一种常用的文件格式,例如WinForm里面的app.config以及Web程序中的web.config文件,还有许多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖于内容的技术,是当前处理结构化文档信息的有力工具.XML是一种简单的数据存储语言,使用一系列简单的标记描述数据,而这些标记可以用方便的方式建立,虽然XML占用的空间比二进制数据要占用更多的空间,但XML极其简单易于掌握和使用.微软也提供了一系列类库来倒帮助我们在应用程序中存储XML文件. “在程序中访问

利用XPath读取Xml文件

之所以要引入XPath的概念,目的就是为了在匹配XML文档结构树时能够准确地找到某一个节点元素.可以把XPath比作文件管理路径:通过文件管理路 径,可以按照一定的规则查找到所需要的文件:同样,依据XPath所制定的规则,也可以很方便地找到XML结构文档树中的任何一个节点. 不过,由于XPath可应用于不止一个的标准,因此W3C将其独立出来作为XSLT的配套标准颁布,它是XSLT以及我们后面要讲到的XPointer的重要组成部分. 在介绍XPath的匹配规则之前,我们先来看一些有关XPath的基

Android中写入读取XML

获取XML文件的基本思路是,通过getResources().getXml()获的XML原始文件,得到XmlResourceParser对象,通过该对象来判断是文档的开头还是结尾,是某个标签的开始还是结尾,并通过一些获取属性的方法来遍历XML文件,从而访问XML文件的内容,下面是一个访问XML文件内容的例子,并将内容更显示在一个TextView上 数据写入xml: ReadXMLTest.java [java] view plaincopy //xml数据生成 private String Wr

使用Pull解析器生成XML文件和读取xml文件

有些时候,我们需要生成一个XML文件,生成XML文件的方法有很多,如:可以只使用一个StringBuilder组拼XML内容,然后把内容写入到文件中:或者使用DOM API生成XML文件,或者也可以使用pull解析器生成XML文件,这里推荐大家使用Pull解析器. 一.布局界面 [html] view plaincopyprint? <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"

读取XML文件内容

myeclipse中类的格式 上面中的RunMain.java为程序执行的入口,JdbcUtil.java为实体类,XmlDocumentUtil.java执行解释xml文件与获取里面的属性,程序所需要导入的包为dom4j-1.6.1.jar与jaxen-1.1-beta-6.jar,jdbc.cfg.xml文件为需解释的xml文件此程序下载 jdbc.cfg.xml <?xml version="1.0" encoding="UTF-8"?> <

Selenium2+Python3.6实战(七):读取xml文件,获得标签信息ExpatError: not well-formed (invalid token)

在读取xml文件的标签信息时,运行后出现错误提示: Traceback (most recent call last):   File "D:/Python/html/read-xml.py", line 3, in     dom = minidom.parse('info.xml')   File "D:\Program Files\Python36\lib\xml\dom\minidom.py", line 1958, in parse     return

读取xml文件报错:Invalid byte 2 of 2-byte UTF-8 sequence。

程序读取xml文件后,系统报“Invalid byte 2 of 2-byte UTF-8 sequence”错误,如何解决呢? 1.程序解析xml的时候,出现Invalid byte 2 of 2-byte UTF-8 sequence的错误 2.应该是编码出现错误,一般用UE,editplus等工具打开文件.修改完成文件后,保存为UTF-8格式就可以了:或者用UltraEdit打开该xml ,一次 文件-->转换-->ASCII到UTF-8, 再保存,即可. 3.也有可能是文件少了头文件定