我无法从assets目录加载xml文件。 使用相同的代码行(只是更改路径)我得到不同的结果(ok或NPE /文件已损坏) 文件“castle1.tmx”(它是一个xml文件)被复制到两个位置:
使用此行,它可以工作:
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
答案 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);
...