前言
一般在电脑上面加载xml文件,我们都会使用XmlDocument.Load(Path)。在pc上面测试的时候是没有问题的,xml文件可以成功加载。但是当我们打包成apk文件,并在手机上面安装并游玩的时候,发现出现问题了,xml文件好像没有加载出来,因为游戏中的对话全部没法正常执行。原来,在安卓环境下不支持XmlDocument.Load(Path)。我们要使用WWW来加载xml文件。
创建xml
我的xml文件:
<?xml version="1.0" encoding="utf-8"?>
<item>
<speakData>
<name>我:</name>
<speak>哎呀!吓我一跳,我只是碰巧路过此地而已,你后面那扇门看起来挺诱人的,嘿嘿</speak>
</speakData>
<speakData>
<name>巨大雕像:</name>
<speak>碰巧路过?你以为人名警察会信你的鬼话么</speak>
</speakData>
<speakData>
<name>我:</name>
<speak>啊?人民警察?完蛋了,万一告我私闯名宅</speak>
</speakData>
<speakData>
<name>巨大雕像:</name>
<speak>不管我是谁,你今天死定了,任何人都不允许通过那扇门,主人是这么说的</speak>
</speakData>
</item>
将xml文件放在Assets文件夹下面的streamingAssets文件夹里面
加载xml文件
利用Application.platform == RuntimePlatform.Android判断是否处于安卓环境,因为Pc端和安卓端的路径写法是不一样的
if (Application.platform == RuntimePlatform.Android)
{
//安卓端写法
filePath = Application.streamingAssetsPath + "/SpeakData/EnemySpeak.xml";
}
else
{
//PC端写法
filePath="file://"+Application.streamingAssetsPath+"/SpeakData/EnemySpeak.xml";
}
然后使用WWW加载路径:
WWW www = new WWW(filePath);
利用 if(www.isDone)判断是否加载成功,加载成功后就可以获取xml的数据了,下面是完整代码:
private IEnumerator LoadXmlData()
{
string filePath;
if (Application.platform == RuntimePlatform.Android)
{
filePath = Application.streamingAssetsPath + "/SpeakData/EnemySpeak.xml";
}
else
{
filePath="file://"+Application.streamingAssetsPath+"/SpeakData/EnemySpeak.xml";
}
WWW www = new WWW(filePath);
yield return www;
if(www.isDone)
{
XmlDocument xDo = new XmlDocument();
xDo.LoadXml(www.text);
//xDo.Load(filePath);
//获取item节点里面的数据
XmlNodeList xnl = xDo.SelectSingleNode("item").ChildNodes;
foreach (XmlElement e in xnl)//遍历子节点数据
{
sdata = new StringBuilder();
foreach (XmlElement e2 in e.ChildNodes)//遍历子节点的子节点数据
{
//判断是哪个节点
if (e2.Name.Equals("name"))
{
sdata.Append(e2.InnerText + "\n");//获取节点内容
}
else if (e2.Name.Equals("speak"))
{
sdata.Append(e2.InnerText);//获取节点内容
}
}
speakList.Add(sdata.ToString());//将每次遍历完的数据添加到List<string>
}
}
yield return null;
}
疑问
使用WWW加载xml文件需要用到协程,我也不知道为什么,如果不使用协程就没法正常加载。到底是什么原理呢?