2011-04-05 96 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 /但我想嘗試把我所有的文件放入資產/而不是。 所以現在它的工作原理:)

感謝您的幫助

相關問題