2011-04-22 58 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);