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

Fab*_*bii 26 java xml httpurlconnection

我试图解析XML response,但我失败了.我最初认为xml只是没有在回复中返回,所以我通过直接链接到我的xml文件在线制作了下面的代码.我能够毫无问题地打印XML到屏幕.但是,当我调用我的parse方法时,我得到文件的过早结束.

如果我直接传递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);
    }
    
    Run Code Online (Sandbox Code Playgroud)

我得到的错误:

    [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)
Run Code Online (Sandbox Code Playgroud)

sbr*_*ges 30

当你这样做,

while((inputLine = buff_read.readLine())!= null){
        System.out.println(inputLine);
    }
Run Code Online (Sandbox Code Playgroud)

你在instream中消耗了所有东西,所以instream是空的.现在,当试图这样做,

Document doc = builder.parse(instream);
Run Code Online (Sandbox Code Playgroud)

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

  • 你是对的,你不能两次读取输入流.很好的解释也在这里:http://www.danielschneller.com/2008/01/saxparseexception-1-1-premature-end-of.html (3认同)
  • @Fabii返回的流有什么问题?我想知道,因为我遇到了同样的问题. (2认同)

小智 6

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