Подтвердить что ты не робот

Почему я получаю эту ошибку Преждевременный конец файла?

Я пытаюсь разобрать и 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);
    }
    

Ошибки, которые я получаю:

    [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)
4b9b3361

Ответ 1

Когда вы это сделаете,

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

Вы потребляете все, что есть в потоке, так что воронка пуста. Теперь, когда вы пытаетесь это сделать,

Document doc = builder.parse(instream);

Синтаксический анализ завершится неудачно, потому что вы передали ему пустой поток.

Ответ 2

Вы получаете ошибку, потому что SAXBuilder недостаточно интеллектуальна для работы с "пустыми состояниями". Таким образом, он ищет хотя бы объявление <xml ..>, и когда это вызывает отсутствие ответа данных, он создает исключение, которое вы видите, а не сообщаете пустое состояние.

Ответ 3

Для тех, кто пришел к этому сообщению для ответа:

Это происходит главным образом из-за отсутствия InputStream анализатора DOM

Итак, в чем я столкнулся, могут быть две ситуации:

  • InputStream, который вы передали в синтаксический анализатор, был использован и, таким образом, опустел.
  • 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 it и catch там, где вы обрабатываете записи, чтобы вы могли распечатать запись, чтобы получить лучшую индикацию об ошибке.