Почему я получаю эту ошибку Преждевременный конец файла?
Я пытаюсь разобрать и XML response
, но я терплю неудачу. Сначала я думал
что xml
просто не возвращался в ответ, поэтому я создал код ниже с прямой ссылкой на мой xml
файл в Интернете. Я могу распечатать xml
на экране без проблем. Однако, когда я вызываю свой метод parse, я получаю Преждевременный конец файла.
Он работает, если я передаю URL-адрес напрямую:
но сбой при передаче 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)
Ответы
Ответ 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
там, где вы обрабатываете записи, чтобы вы могли распечатать запись, чтобы получить лучшую индикацию об ошибке.