【问题标题】:Parse Exception: At line 1, column 0: no element found解析异常:在第 1 行,第 0 列:未找到元素
【发布时间】:2011-02-12 13:12:09
【问题描述】:

我有一个奇怪的问题。我收到以下导致强制关闭的错误:

org.apache.harmony.xml.ExpatParser$ParseException:在第 1 行,第 0 列:在 org.apache.harmony.xml.ExpatParser.parseFragment(ExpatParser.java:508)中找不到元素 在 org.apache.harmony.xml.ExpatParser.parseDocument(ExpatParser.java:467) 在 org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329) 在 org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)

单击“强制关闭”按钮后,将重新创建 Activity 并顺利完成解析。我在 AsyncTask 的 doInBackground 中使用以下代码 sn-p:

URL serverAddress = new URL(url[0]);

HttpURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);
connection.setReadTimeout(10000);
connection.connect();

InputStream stream = connection.getInputStream();

SAXParserFactory spf = SAXParserFactory.newInstance();
SAXParser sp = spf.newSAXParser();

XMLReader xr = sp.getXMLReader();

xr.parse(new InputSource(stream));  // The line that throws the exception

为什么 Activity 会强制关闭然后立即运行而没有任何问题? BufferedInputStream 会有什么不同吗?我很困惑。 :(

感谢大家的宝贵时间。

更新:事实证明 HttpURLConnection.getResponseCode() 经常返回 -1,因此 InputStream 可能没有正确设置。

【问题讨论】:

  • 流好像是空的,你能用commons IOUtils把它的内容转储到System.out.println吗?
  • 这是复制粘贴吗? HTTPURLConnection != HttpURLConnection.
  • 这是一个错字,HttpURLConnection 已修复。对此感到抱歉。

标签: java xml android parsing httpurlconnection


【解决方案1】:

根据InputStream javadoc,该方法将阻塞,直到数据可用或遇到 EOF。因此,Socket 的另一端需要关闭它——然后 inStream.read() 调用将返回。

如果你使用BufferedReader,你可以逐行阅读。读取 HTTP 响应中的一行后,readLine() 方法将立即返回。

【讨论】:

  • 谢谢你的戒指持有人,将进一步调查。
【解决方案2】:
HTTPURLConnection connection = (HttpURLConnection) serverAddress.openConnection();
connection.setRequestMethod("GET");
connection.setDoOutput(true);

那些行有点奇怪。是HTTPURLConnection 还是HttpURLConnection?默认请求方法已经是GET。但是,setDoOutput(true) 将强制它为POST

我会将所有这些行替换为

URLConnection connection = serverAddress.openConnection();

然后重试。它可能会返回错误,因为您强制 POST 并且没有向输出(请求正文)写入任何内容。顺便说一下,connection.connect() 已经被 connection.getInputStream() 隐式调用了,所以该行也是多余的。

更新:以下用于测试目的是否有效?

BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"));
for (String line; (line = reader.readLine()) != null;) {
    System.out.println(line);
}
reader.close();

【讨论】:

  • 感谢 BalusC,非常有用。将进行更改并试一试。有趣的是,大多数时候 XML 解析都没有问题。抛出异常几乎是幸运的……尽管它似乎经常发生,足以成为一个问题。
  • 进行更改后,强制关闭行为仍然存在。似乎解析器没有解析任何东西。连接调试器以深入了解这一点。
  • 关于更新,应该可以,但我认为在 Android 中使用 System.util.Log 而不是 System.out。将测试和更新原始帖子。谢谢!
【解决方案3】:

在相关的设计说明中,加载 URL 的内容永远不应强制关闭活动 - 我建议将所有这些放入 AsyncTask 实现中,并在您返回 GUI 线程后报告或重试。

【讨论】:

  • 同意。原帖中的代码 sn-p 位于 AsyncTask 的 doInBackground 中。
【解决方案4】:

我不知道你是否解决了这个问题,但我遇到了同样的问题。很奇怪,它在模拟器中可以正常工作,但是在电话上,它总是给我xr.parse() 错误。即使我打印了InputStream,它也会给我合法的 xml 文档输出。似乎问题出在 InputSource 对象的创建中

这是我修复它的方法:我没有使用 InputStream 创建您的 InputSource,而是直接从 url 字符串创建输入源。

InputSource a =  new InputSource(url_string);   

其中 url_string 只是一个带有您的 url 的字符串。不要问我为什么它会起作用......我真的不喜欢它,因为没有办法检查超时和类似的事情。但它有效,让我知道它是怎么回事!

【讨论】:

  • 感谢您的回复。我认为它不适用于我的情况,因为我需要使用 HttpURLConnection.setRequestProperty()。我已通过检查响应代码并在代码为 -1 时重试连接来暂时解决此问题。不过,您的意见可能对其他人有所帮助!
【解决方案5】:

我遇到了同样的问题并且无法理解,因为我是直接从 InputSource 解析的。当我修改代码以在 xml 解析之前将结果拉入字符串时,我发现问题只是 Web 服务方法名称拼写错误,并且该服务报告的错误消息是杀手。

【讨论】:

    【解决方案6】:

    即使我也面临同样的问题。 我首先在Scanner 中使用InputStream 来打印它的内容。 然后尝试在 XML 解析器中传递它。

    问题是我没有关闭Scanner 对象。并在解析器中使用Inputstream

    关闭扫描器对象后,我能够解决这个问题。

    【讨论】:

      猜你喜欢
      • 2011-11-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-09-14
      • 2021-03-25
      相关资源
      最近更新 更多