为什么我收到此错误提前结束文件?
我正在尝试解析和XML response
,但我失败了。 我最初认为xml
只是没有在响应中返回,所以我通过在线直接链接到我的xml
文件来制作下面的代码。 我能够毫无问题地将XML
打印到屏幕上。 但是,当我调用我的解析方法时,我得到文件的过早结束。
如果我直接传递URL,它可以工作:
- builder.parse( “”);
但是当我传递一个InputStream时失败:
-
builder.parse(connection.getInputStream());
try { URL url = new URL(xml); URLConnection uc = url.openConnection(); HttpURLConnection connection = (HttpURLConnection )uc; connection.setDoInput(true); connection.setDoOutput(true); InputStream instream; InputSource source; //get XML from InputStream if(connection.getResponseCode()>= 200){ connection.connect(); instream = connection.getInputStream(); parseDoc(instream); } else{ instream = connection.getErrorStream(); } } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ParserConfigurationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SAXException e) { // TODO Auto-generated catch block e.printStackTrace(); } static void parseDoc(InputStream instream) throws ParserConfigurationException, SAXException, IOException{ BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8")); String inputLine = null; while((inputLine = buff_read.readLine())!= null){ System.out.println(inputLine); } DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance(); factory.isIgnoringElementContentWhitespace(); DocumentBuilder builder = factory.newDocumentBuilder(); Document doc = builder.parse(instream); }
我得到的错误:
[Fatal Error] :1:1: Premature end of file. org.xml.sax.SAXParseException: Premature end of file. at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source) at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source) at javax.xml.parsers.DocumentBuilder.parse(Unknown Source) at com.ameba.api.network.MainApp.parseDoc(MainApp.java:78) at com.ameba.api.network.MainApp.main(MainApp.java:41)
当你这样做,
while((inputLine = buff_read.readLine())!= null){ System.out.println(inputLine); }
你在instream中消耗所有东西,所以instream是空的。 现在,当试图这样做,
Document doc = builder.parse(instream);
解析将失败,因为您已经传递了一个空流。
对于那些到达这篇文章的答案:
发生这种情况主要是因为DOM解析器正在使用的InputStream
是空的
因此,在我遇到的情况中,可能有两种情况:
- 您传入解析器的
InputStream
已被使用并因此被清空。 -
File
或您从中创建InputStream
任何内容可能是空文件或字符串或其他内容。 空虚可能是导致问题的原因。 所以你需要检查InputStream
的源代码。
我遇到了同样的错误,可以通过记录exception轻松找到问题所在:
documentBuilder.setErrorHandler(new ErrorHandler() { @Override public void warning(SAXParseException exception) throws SAXException { log.warn(exception.getMessage()); } @Override public void fatalError(SAXParseException exception) throws SAXException { log.error("Fatal error ", exception); } @Override public void error(SAXParseException exception) throws SAXException { log.error("Exception ", exception); } });
或者,不是记录错误,而是可以throw
它并在处理条目的地方catch
它,因此您可以打印条目本身以更好地指示错误。
您收到错误是因为SAXBuilder不够智能,无法处理“空白状态”。 因此它至少会查找
声明,当它导致无数据响应时,它会创建您看到的exception,而不是报告空状态。
- 上传时EPIPE(断管)?
- HttpURLConnection conn.getRequestProperty返回null
- 使用HttpURLConnection到PHP的POST文件
- 如何在java中处理阿拉伯语
- Android – 来自Map 的HttpURLConnection参数通过POST方法
- 在URL.openconnection()时做了什么?
- 通过HttpURLConnection发送UTF-8字符失败
- 如果服务器返回错误状态,java.net.HttpUrlConnection是否总是抛出IOException?
- 如何在JAVA中的HttpURLConnection中发送PUT,DELETE HTTP请求