【问题标题】:Why am I getting this error Premature end of file?为什么我收到此错误文件过早结束?
【发布时间】:2012-04-18 20:24:27
【问题描述】:

我正在尝试解析XML response,但我失败得很惨。我一开始以为 xml 只是没有在响应中返回,所以我制作了下面的代码,并直接链接到我的 xml 在线文件。我可以毫无问题地将XML 打印到屏幕上。但是,当我调用我的解析方法时,我得到 Premature end of file.

如果我直接传递 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)

【问题讨论】:

  • 您是否拥有要解析的 XML 文件。文件过早结束表示您的 XML 文件不完整,因为您在这里使用的是 URL 连接,我怀疑是网络问题。解决此问题的最佳方法是使用 wireshark 或 TCP 监视器类工具捕获此 XML 文件,然后检查它是否完整
  • @NiranjanBhat。是的,XML 是完整且有效的。我已经用直接链接解析了这个 xml。似乎只有在使用 InputStream 时才会出现错误。
  • 为什么你在做一个 POST 但没有发送任何数据?

标签: java xml httpurlconnection


【解决方案1】:

当你这样做时,

while((inputLine = buff_read.readLine())!= null){
        System.out.println(inputLine);
    }

您在流内消耗所有内容,因此流内是空的。现在尝试这样做时,

Document doc = builder.parse(instream);

解析将失败,因为您传递了一个空流。

【讨论】:

  • 我删除了 readLine() 语句。但我仍然遇到同样的错误。如果我提供到 xml 的直接链接,它就可以工作。如果我尝试使用 connection.getInputStream() 如果抛出该错误。
  • 返回的流也存在问题。问题解决了。
  • @Fabii 返回的流有什么问题?我想知道,因为我遇到了同样的问题。
  • 你是对的,你不能两次读取输入流。很好的解释也在这里:danielschneller.com/2008/01/…
  • @sbridges ,很好的解释!
【解决方案2】:

您收到错误是因为 SAXBuilder 不够智能,无法处理“空白状态”。因此,它至少会查找 <xml ..> 声明,当这导致无数据响应时,它会创建您看到的异常,而不是报告空状态。

【讨论】:

  • 这个答案非常有用。如果您从第三方工具收到错误,则并非总是可以调试或更改代码。我处于完全相同的情况,其中一个不应该为空的 XML 实际上是空的。谢谢,我的 +1。
【解决方案3】:

对于那些到达此帖子以获得答案的人:

这主要是因为 DOM 解析器正在消费的 InputStream 是空的

所以在我遇到的情况下,可能有两种情况:

  1. 您传递给解析器的InputStream 已被使用并因此被清空。
  2. File 或您创建InputStream 的任何内容可能是一个空文件或字符串或其他任何内容。空虚可能是导致问题的原因。所以你需要检查InputStream的来源。

【讨论】:

    【解决方案4】:

    我遇到了同样的错误,通过记录异常可以轻松找到问题所在:

    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 它而不是记录错误,这样您就可以打印条目本身以更好地指示错误。

    【讨论】:

      【解决方案5】:

      我通过将源提要从 http://www.news18.com/rss/politics.xml 转换为 https://www.news18.com/rss/politics.xml 解决了这个问题

      下面的代码使用 http 创建了一个空文件,这导致了问题

          String feedUrl = "https://www.news18.com/rss/politics.xml"; 
          File feedXmlFile = null;
      
          try {
          feedXmlFile =new File("C://opinionpoll/newsFeed.xml");
          FileUtils.copyURLToFile(new URL(feedUrl),feedXmlFile);
      
      
                DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
                DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
                Document doc = dBuilder.parse(feedXmlFile);
      

      【讨论】:

      • 这对我来说是不太可能的解决方案,感谢您发布此回复!
      【解决方案6】:

      使用一次输入流不要多次使用它并且 做 inputstream.close()

      【讨论】:

        【解决方案7】:

        另一个原因是,您应该在 mongodb 设置中将您的 IP 地址 (IPv4) 列入白名单。希望能解决!

        【讨论】:

        • 这个答案与作者描述的问题完全无关。
        猜你喜欢
        • 2020-09-14
        • 1970-01-01
        • 2011-09-11
        • 2014-10-01
        • 2018-04-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多