为什么我收到此错误提前结束文件?

我正在尝试解析和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是空的

因此,在我遇到的情况中,可能有两种情况:

  1. 您传入解析器的InputStream已被使用并因此被清空。
  2. 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,而不是报告空状态。