【问题标题】:Android XML Parsing Error - "Couldn't open .../directory/container.xml"Android XML 解析错误 - “无法打开 .../directory/container.xml”
【发布时间】:2011-04-22 21:50:18
【问题描述】:

我正在尝试解析我的 android 设备上 sdCard 上的 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 设备上实现它并遇到了这个错误。错误日志确实没什么用。

如果我能从这里的任何人那里得到任何帮助,我将不胜感激。

【问题讨论】:

  • 请您分享堆栈跟踪,这将帮助我们找出问题的根源/原因。
  • 这是我的问题,try/catch 括号捕获的唯一错误就是我向您展示的内容,它没有给我任何其他信息。之后的任何错误都是由于无法读取文件而导致的。
  • 其实我对这个错误的堆栈跟踪很感兴趣。您应该从 LogCat 复制它(或者如果您不使用它,只需在调试设备上的应用程序时运行 ddms)。请参阅我的帖子,可能会帮助您进入正确的方向。
  • 实际上,当我再次查看时,我发现它有一个 java.net.MalformedURLException,我已经编辑了主要评论以显示这一点。也许这会更接近问题?顺便谢谢你的帮助

标签: java android xml parsing android-sdcard


【解决方案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 文件是否存在等,但基本上这是它应该工作的方式。

请参阅 Android 开发者上的this article about using external storage,以进一步检查存储状态等。

【讨论】:

  • 不,将行更改为 sp.parse(Environment.getExternalStorageDirectory() + "/Speedr/pg55/META-INF/container.xml", xmlHandler);给出同样的错误。
  • 你应该注意上面的那行,它正在创建一个新文件。如果你想坚持静态路径,你应该在你的路径字符串前面指定file://协议(这就是为什么它给你MalformedUrlException)。
  • 我很高兴听到,祝您编码愉快! :)
【解决方案2】:

您是否在清单中启用或添加了 SD 卡权限?

【讨论】:

  • 我启用了 android.permission.INTERNET 和 android.permission.WRITE_EXTERNAL_STORAGE 权限。我相信这就是我所需要的,因为我已经能够毫无问题地加载 .txt 文件。
【解决方案3】:

您必须指定协议,例如 http、ftp、文件等。这里您是从 sdcard 访问它,所以它会在整个路径之前为 "file://"

现在用这个修改你的代码sn-p,

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-03
    • 2013-12-05
    • 1970-01-01
    • 2017-02-05
    • 2012-09-17
    • 2019-01-25
    • 2012-03-28
    相关资源
    最近更新 更多