Вопрос по xml, java – Почему я получаю эту ошибку Преждевременный конец файла?
Я пытаюсь разобрать иXML response
, но я с треском провалился. Я думал изначально
чтоxml
просто не был возвращен в ответе, поэтому я разработал приведенный ниже код с прямой ссылкой на мойxml
подать онлайн. Я могу напечататьXML
на экран без проблем. Однако когда я вызываю мой метод синтаксического анализа, я получаюPremature end of file.
Это работает, если я передам URL напрямую:
builder.parse("");но не удается, когда я передал InputStream:
builder.parse(connection.getInputStream());
<code> 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); } </code>
Ошибки, которые я получаю:
<code> [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) </code>
Для тех, кто достиг этого поста для ответа:
This happens mainly because the InputStream
the DOM parser is consuming is empty
Так что в том, что я столкнулся, могут быть две ситуации:
- The
InputStream
you passed into the parser has been used and thus emptied. - The
File
or whatever you created theInputStream
from may be an empty file or string or whatever. The emptiness might be the reason caused the problem. So you need to check your source of theInputStream
.
Вы получаете ошибку, потому что SAXBuilder недостаточно интеллектуален, чтобы иметь дело с «пустыми состояниями». Так выглядит как минимум<xml ..>
объявление, и когда это вызывает ответ без данных, он создает исключение, которое вы видите, а не сообщать о пустом состоянии.
Я столкнулся с той же ошибкой и смог легко найти проблему, зарегистрировав исключение:
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
это где вы обрабатываете записи, так что вы можете распечатать саму запись, чтобы получить более точную информацию об ошибке.
Когда вы делаете это,
while((inputLine = buff_read.readLine())!= null){
System.out.println(inputLine);
}
Вы потребляете все в instream, поэтому instream пуст. Теперь, когда попытаться сделать это,
Document doc = builder.parse(instream);
Разбор не удастся, потому что вы передали ему пустой поток.