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

问题:    前天在做东西的过程中发现了一个让人很纠结的问题,为什么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 文件的更多相关文章

  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. PHP的几个特殊符号意义

    有些特殊符号需要特殊记忆,希望对你的编程有帮助! 方法/步骤 1 $ 这个符号的意思是:变量 2 & 这个符号的意思是:变量的地址(加在变量前) 3 @ 这个符号的意思是:不显示错误信息(加在 ...

  2. 一点关于this的理解

    关于this,是很多前端面试必考的题目,有时候在网上看到这些题目,自己试了一下,额,还真的错了!在实际开发中,也会遇到 this 的问题(虽然一些类库会帮我们处理),例如在使用一些框架的时候,例如:k ...

  3. 一个用ASP生成html的新方法

    目前已经有很多生成html的新闻系统,但是都是用的模板,本函数实现把asp页面产生的html代码保存成为一个html文件,这样就没有必要改动原来的页面就可以轻松完成一个生成html的新闻系统了.^_^ ...

  4. Classloaders and Classes

    Classloaders and Classes (CLASSES) An example of the classloader (CLASSES) section that includes Cla ...

  5. 批处理 Mysql Findstr

    @set Dump_IP=localhost @set User_Name=root @set Password=1234 @set curPath=%~dp0 mysql -h %Dump_IP% ...

  6. [python] 高效使用assert

    Places to consider putting assertions: checking parameter types, classes, or values checking data st ...

  7. 【转载】C/C++之回调函数

    [转载地址]:http://www.cnblogs.com/chenyuming507950417/archive/2012/01/02/2310114.html 在理解“回调函数”之前,首先讨论下函 ...

  8. SpringInAction读书笔记--第4章面向切面

    1.什么是面向切面编程 在软件开发中,散布于应用中多处的功能被称为横切关注点,这些横切关注点从概念上是与应用的业务逻辑相分离的,但往往分直接嵌入到应用的业务逻辑之中,把这些横切关注点与业务逻辑相分离正 ...

  9. 11_Jaxws常用注解

    [不使用注解] 默认namespace是服务类包名的倒序 默认portType是服务类的类名 ............... 注解的所起的作用: Jaxws提供的注解可以对WebService的接口规 ...

  10. OpenJudge/Poj 1251 丛林中的路/Jungle Roads

    1.链接地址: http://bailian.openjudge.cn/practice/1251/ http://poj.org/problem?id=1251 2.题目: 总时间限制: 1000m ...