Android的XML解析错误 - “无法打开... /目录/ container.xml”
我想解析一个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设备,并遇到了这个错误。错误日志确实没有什么帮助。
我非常感谢任何帮助,我可以从任何人这里得到。
请确保,您已包含下列权限在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开发者,有关存储状态进一步检查等
不行,将行更改为sp.parse(Environment.getExternalStorageDirectory()+“/Speedr/pg55/META-INF/container.xml”,xmlHandler); \t \t给出了相同的错误。 – 2011-04-23 00:50:23
你应该注意上面的行,它正在创建一个新文件。如果你想坚持静态路径,你应该在你的路径字符串前面指定'file://'协议(这就是为什么它给你'MalformedUrlException')。 – rekaszeru 2011-04-23 06:13:18
这工作,谢谢:) – 2011-04-24 00:29:11
您是否在清单中启用或添加了SD卡权限?
我有权限android.permission.INTERNET和android.permission.WRITE_EXTERNAL_STORAGE启用。我相信这就是所需要的,因为我已经能够毫无问题地加载.txt文件。 – 2011-04-22 22:53:28
你必须指定一个像HTTP,FTP协议,文件等,在这里,你是从SD卡访问它,所以它会"file://"
在整个路径之前。
现在修改您的代码段与此,
SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();
sp.parse("file://" + "/mnt/sdcard/Speedr/pg55/META-INF/container.xml", xmlHandler);
请你分享堆栈跟踪,这将帮助我们找出其中/为什么这个问题可能起源。 – rekaszeru 2011-04-22 21:59:26
这是我的问题,那是被try/catch括号捕获的唯一错误就是我向你展示的东西,它没有给我任何其他东西。之后的任何错误都很简单,因为无法读取文件。 – 2011-04-22 22:45:42
其实我对这个错误的堆栈跟踪感兴趣。您应该从LogCat中复制它(或者如果您不使用它,只需在设备上调试应用程序时运行ddms)。请看我的帖子,可能会帮助你进入正确的方向。 – rekaszeru 2011-04-22 23:22:45