2011-04-22 63 views
1

我想解析一個XML文件,坐在我的Android設備上的SD卡上。Android的XML解析錯誤 - 「無法打開... /目錄/ container.xml」

這段代碼 -

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 
sp.parse("/mnt/sdcard/Speedr/pg55/META-INF/container.xml", xmlHandler); 

輸出這個錯誤 -

無法打開/mnt/sdcard/Speedr/pg55/META-INF/container.xml

導致:java.net.MalformedURLException:未找到協議:/mnt/sdcard/Speedr/pg55/META-INF/container.xml

爲了簡單起見,我更改了sp.parse()位置,但這正是在實際代碼中交給該方法的內容。我也拿走了應該圍繞它的try/catch托架。

文件是最肯定有,我可以看到它,如果我瀏覽到它在我的手機或電腦,而且位置也正確的,因爲它沒有給我一個FileNotFound錯誤。

我最初建於獨立的Java代碼並一直在努力實現它在Android設備,並遇到了這個錯誤。錯誤日誌確實沒有什麼幫助。

我非常感謝任何幫助,我可以從任何人這裏得到。

+0

請你分享堆棧跟蹤,這將幫助我們找出其中/爲什麼這個問題可能起源。 – rekaszeru 2011-04-22 21:59:26

+0

這是我的問題,那是被try/catch括號捕獲的唯一錯誤就是我向你展示的東西,它沒有給我任何其他東西。之後的任何錯誤都很簡單,因爲無法讀取文件。 – 2011-04-22 22:45:42

+0

其實我對這個錯誤的堆棧跟蹤感興趣。您應該從LogCat中複製它(或者如果您不使用它,只需在設備上調試應用程序時運行ddms)。請看我的帖子,可能會幫助你進入正確的方向。 – rekaszeru 2011-04-22 23:22:45

回答

1

請確保,您已包含下列權限在androidManifest.xml,在你想修改您的XML,或保存其他情況:

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> 

和你的代碼更改爲:

final File xml = new File(Environment.getExternalStorageDirectory(). 
     getAbsolutePath() + "Speedr/pg55/META-INF/container.xml"); 
sp.parse(xml, xmlHandler); 

這樣你就可以將文件傳遞給解析器,所以你不需要指定file://協議。
請勿嘗試使用靜態路徑。外部存儲路徑根據設備而改變。
使用Environment.getExternalStorageDirectory()是最好的做法。

您可能還需要檢查xml文件是否存在,等等,但基本上這是應該的工作方式。

請參閱this article about using external storage在Android開發者,有關存儲狀態進一步檢查等

+0

不行,將行更改爲sp.parse(Environment.getExternalStorageDirectory()+「/Speedr/pg55/META-INF/container.xml」,xmlHandler); \t \t給出了相同的錯誤。 – 2011-04-23 00:50:23

+2

你應該注意上面的行,它正在創建一個新文件。如果你想堅持靜態路徑,你應該在你的路徑字符串前面指定'file://'協議(這就是爲什麼它給你'MalformedUrlException')。 – rekaszeru 2011-04-23 06:13:18

+0

這工作,謝謝:) – 2011-04-24 00:29:11

1

您是否在清單中啓用或添加了SD卡權限?

+0

我有權限android.permission.INTERNET和android.permission.WRITE_EXTERNAL_STORAGE啓用。我相信這就是所需要的,因爲我已經能夠毫無問題地加載.txt文件。 – 2011-04-22 22:53:28

1

你必須指定一個像HTTP,FTP協議,文件等,在這裏,你是從SD卡訪問它,所以它會"file://"在整個路徑之前。

現在修改您的代碼段與此,

SAXParserFactory spf = SAXParserFactory.newInstance(); 
SAXParser sp = spf.newSAXParser(); 
sp.parse("file://" + "/mnt/sdcard/Speedr/pg55/META-INF/container.xml", xmlHandler);