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

时间:2011-04-05 20:12:19

标签: android resources load

我无法从assets目录加载xml文件。 使用相同的代码行(只是更改路径)我得到不同的结果(ok或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

5 个答案:

答案 0 :(得分:18)

res/文件夹中,所有xml文件都是预编译的,而在assets/文件夹中则不是。因此,您不能将openXmlResourceParser()与未预编译的资源一起使用。而是使用open()并通过InputStream读取文件。

答案 1 :(得分:16)

我成功从资源目录(assets / level / castle1.tmx)加载和解析我的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"));

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

感谢您的帮助

答案 2 :(得分:4)

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

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

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

答案 3 :(得分: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");
       ....

答案 4 :(得分:0)

    Resources resourcesForApplication = activity.getPackageManager().getResourcesForApplication(activity.getPackageName());
    AssetManager assets = resourcesForApplication.getAssets();
    InputStream xmlInputStream = assets.open("templates/horizontal/ybard/front/ybcard.xml");

    XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
    factory.setNamespaceAware(true);
    XmlPullParser parseXml = factory.newPullParser();

    parseXml.setInput(xmlInputStream ,"UTF-8");



    while ((eventType = parseXml.nextToken()) != XmlPullParser.END_DOCUMENT){

        if (eventType == XmlPullParser.START_TAG && parseXml.getName().equals("layers")) {

            String documentWidth = parseXml.getAttributeValue(0);
            String documentHeight = parseXml.getAttributeValue(1);
            ...