解析异常:在第1行第0列:未找到任何元素

时间:2010-04-26 18:57:22

标签: java xml android parsing httpurlconnection

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

  

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)   at org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:329)   在org.apache.harmony.xml.ExpatReader.parse(ExpatReader.java:286)

单击“强制关闭”按钮后,将重新创建“活动”,并且解析完成顺利进行。我在AsyncTask的doInBackground中使用以下代码片段:

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。

6 个答案:

答案 0 :(得分:6)

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();

答案 1 :(得分:2)

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

以下是我修复它的方法:而不是使用InputStream来创建InputSource我直接从url字符串创建了输入源。

InputSource a =  new InputSource(url_string);   

其中url_string只是一个包含您网址的字符串。不要问我它为什么有效......我真的不喜欢它,因为没有办法检查超时和类似的东西。但是它有效,让我知道它是怎么回事!

答案 2 :(得分:1)

InputStream个javadoc,该方法将阻塞,直到数据可用或遇到EOF。所以,Socket的另一面需要关闭它 - 然后inStream.read()调用将返回。

如果您使用BufferedReader,则可以逐行阅读。只要读取HTTP响应中的一行,readLine()方法就会返回。

答案 3 :(得分:1)

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

答案 4 :(得分:1)

即使我遇到同样的问题。 我第一次使用InputStream中的Scanner来打印它的内容。 然后尝试在XML解析器中传递它。

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

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

答案 5 :(得分:0)

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