原地址:http://www.cnblogs.com/wuzhang/p/wuzhang20140731.html

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

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

那么解决方法很简单:

1,建立一个新工程

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

如下:

3,该贴代码了

  1. //------------------------------------------------------------------------------
  2. // <auto-generated>
  3. // 此代码由工具生成。
  4. // 运行时版本:4.0.30319.18063
  5. //
  6. // 对此文件的更改可能会导致不正确的行为,并且如果
  7. // 重新生成代码,这些更改将会丢失。
  8. // </auto-generated>
  9. //------------------------------------------------------------------------------
  10. using System;
  11. using UnityEngine;
  12. using System.IO;
  13. using System.Xml;
  14. using System.Linq;
  15. using System.Text;
  16. using System.Collections;
  17. using System.Collections.Generic;
  18.  
  19. namespace AssemblyCSharp1
  20. {
  21.  
  22. public class AddressData1
  23. {
  24. public string timeURL;
  25. public static string all;
  26. public static string hp;
  27. public static string speed;
  28. public static string demage;
  29.  
  30. public static string localPath;
  31. public static string id;
  32. public static string score;
  33. public static List<int> allScore;
  34.  
  35. public void AddressData ()
  36. {
  37. Debug.Log (localPath);
  38. }
  39.  
  40. public static List<int> getAllScore()
  41. {
  42. return allScore;
  43. }
  44.  
  45. /// <summary>
  46. /// 获取XML路径
  47. /// </summary>
  48. /// <returns>The XM.</returns>
  49. public static IEnumerator GetXML()
  50. {
  51. if(Application.platform==RuntimePlatform.Android)
  52. {
  53. localPath = Application.streamingAssetsPath+"/score.xml"; //在Android中实例化WWW不能在路径前面加"file://"
  54. Debug.Log (localPath);
  55. }
  56. else
  57. {
  58. localPath = "file://"+UnityEngine.Application.streamingAssetsPath + "/score.xml";//在Windows中实例化WWW必须要在路径前面加"file://"
  59.  
  60. Debug.Log (localPath);
  61. }
  62. WWW www = new WWW(localPath);
  63. while (!www.isDone)
  64. {
  65. Debug.Log("Getting GetXML");
  66. yield return www;
  67. all = www.text;
  68. ParseXml(www);
  69. }
  70. }
  71.  
  72. /// <summary>
  73. ///按属性获取节点
  74. /// </summary>
  75. /// <param name="www">Www.</param>
  76. public static void ParseXml(WWW www)
  77. {
  78. if(allScore == null)
  79. {
  80. allScore =new List<int>();
  81. }
  82. XmlDocument xmlDoc = new XmlDocument();
  83. xmlDoc.LoadXml(www.text);
  84. XmlNodeList nodeList=xmlDoc.SelectSingleNode("rank").ChildNodes;
  85.  
  86. foreach(XmlElement xe in nodeList)
  87. {
  88. id = xe.GetAttribute("id");
  89. score = xe.GetAttribute("score");
  90. allScore.Add(int.Parse(score)); //将所有得分读入List
  91.  
  92. Debug.Log ("ID:"+id+" Score:"+score);
  93. }
  94. allScore.Sort();
  95. allScore.Reverse();
  96. foreach(var score in allScore )
  97. {
  98. Debug.Log (score.ToString());
  99. }
  100. }
  101.  
  102. /// <summary>
  103. /// 读取xml内容
  104. /// </summary>
  105. public static IEnumerator load()
  106. {
  107. string url = string.Empty;
  108. string path = string.Empty;
  109. string line1 = string.Empty;
  110. if(Application.platform==RuntimePlatform.Android)
  111. {
  112. url=Application.streamingAssetsPath+"/hp.xml"; //在Android中实例化WWW不能在路径前面加"file://"
  113.  
  114. WWW wWA=new WWW(path);///WWW读取在各个平台上都可使用
  115. yield return wWA;
  116. line1=wWA.text;
  117. Debug.Log (line1);
  118. }
  119. else
  120. {
  121. url="file://"+Application.streamingAssetsPath+"/hp.xml";//在Windows中实例化WWW必须要在路径前面加"file://"
  122. WWW wWA=new WWW("file://"+url);
  123. yield return wWA;
  124. line1=wWA.text;
  125. Debug.Log (line1);
  126. }
  127. yield return null;
  128. }
  129.  
  130. /// <summary>
  131. /// 加载xml文档
  132. /// </summary>
  133. /// <returns></returns>
  134. public static XmlDocument ReadAndLoadXml()
  135. {
  136. XmlDocument doc = new XmlDocument();
  137. //Debug.Log("加载xml文档");
  138. doc.Load(localPath);
  139. return doc;
  140. }
  141.  
  142. /// <summary>
  143. /// 增加节点
  144. /// </summary>
  145. /// <returns>The node.</returns>
  146. /// <param name="score">Score.</param>
  147. public static void insertNode(int score)
  148. {
  149. int minute=int.Parse((System.DateTime.Now.Minute.ToString()));
  150. string order = System.DateTime.Now.Hour+""+System.DateTime.Now.Minute+""+System.DateTime.Now.Second;
  151. XmlDocument xmlDoc=new XmlDocument();
  152. xmlDoc.Load(Application.dataPath + "/StreamingAssets/score.xml");
  153. XmlNode root=xmlDoc.SelectSingleNode("rank");
  154.  
  155. XmlElement xel=xmlDoc.CreateElement("rank"); //建立节点
  156. xel.SetAttribute("id",order);
  157. xel.SetAttribute("score",score.ToString());
  158.  
  159. root.AppendChild(xel);
  160. xmlDoc.Save(Application.dataPath + "/StreamingAssets/score.xml");
  161. return;
  162. }
  163.  
  164. }
  165.  
  166. }

测试读取数据代码:

  1. using UnityEngine;
  2. using System.Collections;
  3. using AssemblyCSharp1;
  4.  
  5. public class testinsert : MonoBehaviour
  6. {
  7. public GUIText guitext;
  8. public GUIText platform;
  9. string allscores="";
  10.  
  11. void Awake()
  12. {
  13. if(Application.platform==RuntimePlatform.Android)
  14. {
  15. platform.text = "Android";
  16. }
  17. else
  18. {
  19. platform.text = "PC";
  20. }
  21. }
  22.  
  23. // Use this for initialization
  24. void Start ()
  25. {
  26.  
  27. StartCoroutine(AddressData1.GetXML());
  28. //AddressData1.insertNode(22);
  29.  
  30. }
  31.  
  32. void OnGUI()
  33. {
  34. if(GUI.Button(new Rect(100,100,40,40),"load"))
  35. {
  36. foreach(int score in AddressData1.allScore)
  37. {
  38. allscores+=score.ToString();
  39. guitext.text+="\t";
  40. }
  41. guitext.text = allscores;
  42. }
  43. }
  44.  
  45. // Update is called once per frame
  46. void Update ()
  47. {
  48.  
  49. }
  50. }

XML文件:
score.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <rank>
  3. <rank id="5618" score="12" ></rank>
  4. <rank id="1712" score="14" ></rank>
  5. </rank>

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

运行后:

点击load按钮:

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

PC上测试Ok了吧。

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

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

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

  1. Android 开发自己的网络收音机4——读取XML文件的电台数据

    国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...

  2. unity Android在streamingAssets路径下文件无法读取的的解决方法

    unity Android在streamingAssets路径下文件,有时候plugin下的.jar或者.so无法直接读取: 解决方法之一,拷贝至其他路径: #if UNITY_ANDROID str ...

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

    本博客如需转载.请注明出处. ------------------------------------------------------------------------------------- ...

  4. 读取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- ...

  5. 在C#中创建和读取XML文件

    1.创建简单的XML文件 为了便于测试,我们首先创建控制台应用程序,项目命名为CreateXml,Program.cs代码如下: 这样会在C盘根目录下创建data2.xml文件,文件内容为 using ...

  6. Android color(颜色) 在XML文件和java代码中

    Android color(颜色) 在XML文件和java代码中,有需要的朋友可以参考下. 1.使用Color类的常量,如: int color = Color.BLUE;//创建一个蓝色 是使用An ...

  7. java读取xml文件报“org.xml.sax.SAXParseException: Premature end of file” .

    背景:java读取xml文件,xml文件内容只有“<?xml version="1.0" encoding="UTF-8"?>”一行 java读取该 ...

  8. C#中经常使用的几种读取XML文件的方法

    XML文件是一种经常使用的文件格式,比如WinForm里面的app.config以及Web程序中的web.config文件,还有很多重要的场所都有它的身影.Xml是Internet环境中跨平台的,依赖 ...

  9. 读取XML文件内容

    myeclipse中类的格式 上面中的RunMain.java为程序执行的入口,JdbcUtil.java为实体类,XmlDocumentUtil.java执行解释xml文件与获取里面的属性,程序所需 ...

随机推荐

  1. uiautomator日志文件转换为xml格式文件

    如果想把uiautomator的日志文件,转换成漂亮的xml文件,那么可以使用automator-log-converter.jar工具, 工具使用方法: 使用工具automator-log-conv ...

  2. IP地址,子网掩码划分(转)

    IP地址划分教程 IP和子网掩码我们都知道,IP是由四段数字组成,在此,我们先来了解一下3类常用的IP A类IP段 0.0.0.0 到127.255.255.255 B类IP段 128.0.0.0 到 ...

  3. [记录]java.math.biginteger cannot be cast to java.lang.long

    可以直接使用BigInteger类型进行接收, BigInteger id = (BigInteger)QueryRunner(conn,"SELECT LAST_INSERT_ID&quo ...

  4. PHP之会话控制小结

    会话控制是一种跟踪用户的通信方式,使用会话控制主要基于以下几点:由于http协议的无状态性,使得不能通过协议来建立两次请求之间的关联:对于通常的页面之间的数据传递方式get和post而言,主要处理参数 ...

  5. RabbitMQ 原文译04--路由

    在前一篇文章中我们构建了一个简单的日志系统,我们可以向多个接受者广播消息. 在这篇文章我,我们将要添加一些功能使得针对部分消息的接受成为可能,例如我们只对错误的消息进行磁盘记录,同时又可以把所有的消息 ...

  6. Spring AOP (Spring 3.x 企业应用开发实战读书笔记第六章)

    从面相对象编程到面相切面编程,是一种代码组织方式的进化. 每一代的代码组织方式,其实是为了解决当时面对的问题.比如写编译器和写操作系统的时候的年代当然要pop,比如写界面的时候当然要oop,因为界面这 ...

  7. WCF编程系列(三)地址与绑定

    WCF编程系列(三)地址与绑定   地址     地址指定了接收消息的位置,WCF中地址以统一资源标识符(URI)的形式指定.URI由通讯协议和位置路径两部分组成,如示例一中的: http://loc ...

  8. ajaxError

    $(document).ready(function () { $('input:button').click(function() { if($('#fileName').val() == '') ...

  9. Error 1937.An error occurred during the installation of assembly...

    工具:Installshield 2008 任务: 1. 创建一个 Merge Module 工程, 在 Merge Module 中包含若干 dll, 在安装过程中,dll 会被安装到指定路径. 2 ...

  10. js之replace实现简单模板替换引擎

    eg: var app={}; app.tempEngine= (function () {  var pattern = /\{(\w*[:]*[=]*\w+)\}(?!})/g;  return ...