2011-04-05 55 views
14

我无法从assets目录加载xml文件。 使用的代码(只是改变了路径)我得到不同的结果(OK或NPE /文件损坏)的同一行 “castle1.tmx”(这是一个XML文件)在两个位置被复制的文件:android:如何从资产目录加载xml文件?

  • RES/XML/castle1.tmx
  • 资产/这条线的水平/ castle1.tmx

,它的工作原理:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("res/xml/castle1.tmx"); 

,而这条线就ð oesn't:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("assets/level/castle1.tmx"); 

我得到以下结果:

04-05 21:46:40.940: WARN/ResourceType(29056): Bad XML block: header size 28024 or total size 1702240364 is larger than data size 70441 
04-05 21:46:40.940: ERROR/TestParser(29056): Unable to read resource file 
04-05 21:46:40.940: WARN/System.err(29056): java.io.FileNotFoundException: Corrupt XML binary file 
04-05 21:46:40.940: WARN/System.err(29056):  at android.content.res.AssetManager.openXmlAssetNative(Native Method) 
04-05 21:46:40.944: WARN/System.err(29056):  at android.content.res.AssetManager.openXmlBlockAsset(AssetManager.java:485) 
04-05 21:46:40.944: WARN/System.err(29056):  at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:453) 
04-05 21:46:40.944: WARN/System.err(29056):  at android.content.res.AssetManager.openXmlResourceParser(AssetManager.java:442) 
04-05 21:46:40.944: WARN/System.err(29056):  at game.test.MapLoader.<init>(MapLoader.java:73) 

文件是在这两个案例中发现... 它只是我似乎无法能够使用来自资产目录阅读该方法..

任何想法如何从资产目录加载我的XML文件?

TNX

回答

17

res/文件夹中所有xml文件都是预编译的,而在assets/文件夹中则不是。所以,你不能使用openXmlResourceParser()与非预编译资源。请使用open()并通过InputStream读取文件。

+0

加载标准XML文件,所以我可以用什么来解析XML文件在/assets/blah.xml中?是否必须手动搜索关键字和属性属性,创建我自己的解析器?没有其他选择? – freeaks 2011-04-05 21:09:25

+0

您始终可以使用Java给出的解析器,例如XPath – Gerard 2013-07-01 13:25:56

3

看一看

https://github.com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/Board.java#L30 这是从 https://github.com/pilhuhn/TurtleCar/blob/master/src/de/bsd/turtlecar/SampleView.java#L45

呼吁例子。

基本上你需要问AssetManager的文件:

AssetManager assetManager = context.getAssets(); 
    try { 
     InputStream is = assetManager.open("1.xml"); 
     .... 
+0

TNX的链接 – freeaks 2011-04-05 21:15:52

+0

很好的例子,谢谢! – pennyrave 2013-06-21 12:06:03

3

的原因是因为你要加载的二进制XML文件(你的错误是java.io.FileNotFoundException: Corrupt XML binary file)。

存储在res中的所有Android XML文件(布局,字符串等)在编译项目时会自动编译为二进制XML。资产中的XML文件被视为标准的XML文件,因此不会被编译为二进制XML。

总结:Android XML文件必须位于res文件夹中。您只能将纯文本XML存储在资产文件夹中(不包括布局文件等)。

+0

那么,如何解析资产/目录内的xml文件呢?我应该加载整个XML文件作为一个大字符串,并开始搜索关键字属性属性和手动? – freeaks 2011-04-05 21:14:11

+0

他不是在谈论Android XML文件,而是关于他自己的XML格式 – 2011-04-06 05:26:22

+0

@Heiko我的坏 - 在这种情况下*他*应该能够从资产 – 2011-04-06 10:01:02

16

我成功地从资产目录(assets/level/castle1)加载和解析我的xml文件。TMX)

这里就是我所做的:

更换此:

XmlResourceParser xrp = ctx.getResources().getXml(ctx.getResources().getIdentifier(name, "xml", ctx.getPackageName())); 

本:

InputStream istr = context.getAssets().open("level/"+name+".tmx"); 
    XmlPullParserFactory factory = XmlPullParserFactory.newInstance(); 
    factory.setNamespaceAware(true); 
    xrp = factory.newPullParser(); 
    xrp.setInput(istr, "UTF-8"); 

那么我要做的就是编辑一些getAttributeIntValue()行:

int a = xrp.getAttributeIntValue(null, "width",0)); 

这个:

int a = Integer.parseInt(xrp.getAttributeValue(null, "width")); 

和所有其余的工作没有修改:) ..this类是用于解析XML瓷砖/图文件来构建自己的比赛水平。 之前,它使用res /但我想尝试把我所有的文件放入资产/而不是。 所以现在它的工作原理:)

感谢您的帮助

相关问题