您的位置:首页 > 移动开发 > Unity3D

unity3D 手机读取XML,安卓下为什么读取不了

2015-01-20 01:09 330 查看
我们都知道如果将档案或Prefab放到Resources的资料夹,就可以透过Resources这个class读取资料夹中的档案或Prefab。我们也知道在Unity里头,可以使用.NET Framework的XmlReader来读取XML档案。我们更清楚,使用Application.dataPath可以取得Assert资料夹的位置。所以当你把XML档案放置於Resources资料夹中,你要怎么读取这个档案呢?Unity3D教程手册

我会使用XmlReader这个Class,然后档案读取路径为:Application.dataPath + “Resources/expTable.xml”。接着用MS给的范例读取我要的资料,如下所示:

   
01
while( reader.Read() ) {
02
 
03
  switch( reader.NodeType ) {
04
 
05
  case XmlNodeType.Element:
06
 
07
  break;
08
 
09
  }
10
 
11
  }
一切就绪,启动Editor,资料正常!Unity3D教程手册。慢着~怎么放上Android手机後不正常?对!你中招了,因为Application.dataPath在手机上所表示的路径根本不是Asset资料夹所在的位置,而是:

   
1
/mnt/asec/com.xxx.projectx/pkg.apk  (以Android为例)
所以在PC可以Loading的档案,现在变成找不到!解法的办法是:

   
1
  //一样利用Resources class读取xml,只是先暂时转换成TextAsset
2
 
3
  TextAsset t = Resources.Load(“expTable”) as TextAsset ;
4
 
5
  //接着再转换成XmlReader
6
 
7
  XmlReader reader = XmlReader.Create( new StringReader( t.text ) );
OK!完成!

补充:

TextAsset可以支援UTF-8的编码,如果有使用中文的朋友,记得把XML档案存成UTF-8格式。在Windows底下,你可以使用PSPad,到“格式” -> “UTF-8″ 後存档即可。

XmlDocument和XElement在读取Xml时要将整个Xml文档放到内存中去操作,这样做操作简单,但是很费内存和IO(可能是磁盘IO或者网络IO);而在有些场景下我们必须考虑尽可能节省内存和IO的开销,这时候就该XmlReader和XmlWriter出场了。

XmlReader读取Xml需要通过Read()实例方法,不断读取Xml文档中的声明,节点开始,节点内容,节点结束,以及空白等等,直到文档结束,Read()方法返回false。
如下读取Xml内容实例代码和注释说明

//玉开技术博客:http://blog.csdn.net/yukaizhao
using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.IO;

namespace UseXmlReader
{
class Program
{
static void Main(string[] args)
{
//声明StringReader传入Xml文本,作为XmlReader.Create的参数
using (StringReader strRdr = new StringReader(@"<?xml version=""1.0"" encoding=""utf-8"" ?>
<root>
<cat color=""white"">I'm a Cat</cat>
<dog color=""yellow""/>
</root>"))
{
//通过XmlReader.Create静态方法创建XmlReader实例
using (XmlReader rdr = XmlReader.Create(strRdr))
{
//循环Read方法直到文档结束
while (rdr.Read())
{
Console.WriteLine("rdr.NodeType = " + rdr.NodeType);
//如果是开始节点
if (rdr.NodeType == XmlNodeType.Element) {
//通过rdr.Name得到节点名
string elementName = rdr.Name;

Console.WriteLine(elementName + " element start");
if (elementName == "root") {

}
//读取到cat元素 这时rdr.Read()读取到的内容为<cat color="white">
else if (elementName == "cat")
{
//可以通过中括号获得属性值
string colorVal = rdr["color"];
Console.WriteLine("\tcat's color is " + colorVal);

//读取到节点内文本内容
if(rdr.Read()) {
//通过rdr.Value获得文本内容
Console.WriteLine("\t cat said:" + rdr.Value);
}
}
}
else if (rdr.NodeType == XmlNodeType.EndElement)
{
//在节点结束时也可以通过rdr.Name获得节点名字
string elementName = rdr.Name;
Console.WriteLine(elementName + " element end");
}
}
}
}

Console.Read();
}
}
}


如果觉得代码不明白,下面是一张读取顺序图,标明了读取顺序号和每次读取的内容,如下图所示:



从图中可以看到XmlReader在读取这段Xml时:

第1次Read()读取的是Xml文档声明部分

第2次Read()读取的是声明后的空白

第3次Read()读取的是根节点root的开始标签

第4次Read()读取的是根节点开始后的空白

第5次Read()读取的是cat节点的开始部分,从左尖括号到右尖括号包括该节点的属性

第6次读取的是cat节点的内容

第7次读取的是cat节点的结束标签

第8次读取的是cat节点结束标签后的空白

第9次读取的是dog节点的开始部分,注意是从左尖括号开始到结束斜杠之前

第10次读取的是dog标签的结束/>

第11次读取的是dog标签结束后的空白

第12次读取的是root的结束标签
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: