android:如何从assets目录加载xml文件?

fre*_*aks 16 resources android load

我从资产目录加载xml文件时遇到问题.使用相同的代码行(只是更改路径)我得到不同的结果(ok或NPE /文件已损坏)文件"castle1.tmx"(它是一个xml文件)被复制到两个位置:

  • RES/XML/castle1.tmx
  • 资产/级别/ castle1.tmx

使用这一行,它的工作原理:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("res/xml/castle1.tmx");
Run Code Online (Sandbox Code Playgroud)

虽然这条线不是:

XmlResourceParser xrp = ctx.getAssets().openXmlResourceParser("assets/level/castle1.tmx");
Run Code Online (Sandbox Code Playgroud)

我得到以下结果:

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)
Run Code Online (Sandbox Code Playgroud)

文件在两种情况下都可以找到...这只是我似乎无法使用该方法从资产目录中读取它.

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

TNX

GrA*_*And 18

res/文件夹中,所有xml文件都是预编译的,而在assets/文件夹中则不是.因此,您不能使用openXmlResourceParser()非预编译资源.而是open()通过使用和读取文件InputStream.


fre*_*aks 16

我成功从资源目录(assets/level/castle1.tmx)加载和解析我的xml文件

这就是我所做的:

取而代之的:

  XmlResourceParser xrp = ctx.getResources().getXml(ctx.getResources().getIdentifier(name, "xml", ctx.getPackageName()));
Run Code Online (Sandbox Code Playgroud)

这样:

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

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

  int a = xrp.getAttributeIntValue(null, "width",0));
Run Code Online (Sandbox Code Playgroud)

进入这个:

  int a = Integer.parseInt(xrp.getAttributeValue(null, "width"));
Run Code Online (Sandbox Code Playgroud)

所有其余的工作没有修改:) ..这个类是解析平铺的xml /地图文件,以建立我的游戏关卡.以前,它使用res /但我想尝试将所有文​​件放入资产/.所以现在它的工作:)

谢谢您的帮助