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

我无法从资产目录加载一个XML文件。 使用相同的代码行(只是改变path),我得到不同的结果(无论是正确的或NPE /文件损坏)文件“castle1.tmx”(这是一个XML文件)被复制到两个位置:

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

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

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

而这条线不是:

 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

Solutions Collecting From Web of "android:如何从资产目录加载xml文件?"

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

我成功地从资产目录(assets / level / castle1.tmx)加载和parsing我的XML文件。

这是我做的:

取而代之:

  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")); 

其余所有工作没有修改:) ..这个类是parsing平铺的XML /地图文件来build立我的游戏关卡。 之前,它使用res /但我想尝试把我所有的文件到资产/而不是。 所以现在它的工作:)

谢谢您的帮助

看一下

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"); .... 

原因是因为您正在尝试加载二进制XML文件(您的错误是java.io.FileNotFoundException: Corrupt XML binary file )。

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

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