2012-04-05 26 views
20

Próbuję parsować i XML response, ale ponoszę porażkę. Początkowo myślałem, że , że xml po prostu nie został zwrócony w odpowiedzi, więc stworzyłem poniższy kod z bezpośrednim linkiem do mojego pliku xml online. Jestem w stanie wydrukować XML na ekranie bez żadnych problemów. Jednak gdy zadzwonię do mojej metody parsowania, otrzymam Przedwczesny koniec pliku.Dlaczego pojawia się ten błąd Przedwczesny koniec pliku?

Działa jeśli mijam URL bezpośrednio:

  • builder.parse ("");

ale nie powiedzie się, gdy zdałem 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); 
    } 
    

Błędy otrzymuję:

[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) 
+0

Czy masz plik XML, który próbujesz analizować. Przedwczesny koniec pliku wskazuje, że plik XML nie był kompletny, ponieważ używasz tutaj połączenia URL, podejrzewam problemy z siecią. Najlepszym sposobem rozwiązania tego problemu jest przechwytywanie tego pliku XML przy użyciu narzędzi typu Wireshark lub monitora TCP, a następnie sprawdzenie, czy jest on kompletny: – NiranjanBhat

+0

@NiranjanBhat. Tak, XMl jest kompletny i ważny. Przetworzyłem ten plik XML za pomocą bezpośredniego linku. Wygląda na to, że błąd pojawia się tylko wtedy, gdy używasz InputStream. – Fabii

+0

Dlaczego robisz POST, ale nie wysyłasz żadnych danych? – EJP

Odpowiedz

25

Kiedy to zrobisz,

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

spożywać wszystko w In-Stream, więc In-Stream jest pusty. Teraz, gdy próbujemy to zrobić, przetwarzanie zakończy się niepowodzeniem, ponieważ przekazaliśmy pusty strumień.

+0

Usunąłem instrukcję readLine(). Ale wciąż mam ten sam błąd. Jeśli dostarczę bezpośredni link do xml, to działa. Jeśli próbuję przetwarzać przy użyciu metody connection.getInputStream(), jeśli zgłasza ten błąd. – Fabii

+0

Wystąpił również problem ze strumieniem, który był zwracany. Problem rozwiązany. – Fabii

+2

@Fabii Na czym polegał problem z zwracanym strumieniem? Chcę wiedzieć, ponieważ mam ten sam problem. – NobleUplift

0

natknąłem się tego samego błędu i może łatwo znaleźć to, co było problemem logując wyjątek:

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); 
    } 
}); 

Albo zamiast zalogowaniu się błąd, można go throw i catch go gdzie obsłużyć wpisów, aby można było wydrukować sam wpis, aby uzyskać lepsze wskazanie błędu.

1

Otrzymujesz błąd, ponieważ SAXBuilder nie jest wystarczająco inteligentny, aby radzić sobie z "pustymi stanami". Tak więc poszukuje co najmniej deklaracji <xml ..>, a gdy to powoduje brak odpowiedzi na dane, tworzy wyjątek, który widzisz, zamiast raportować pusty stan.

2

Dla tych, którzy dotarli do tego wpisu za odpowiedź:

Dzieje się tak głównie dlatego, że InputStream parser DOM zużywa jest pusty

Więc w jaki natknąłem, nie może być dwie sytuacje:

  1. Przekazany do analizatora składni numer InputStream został użyty, a tym samym opróżniony.
  2. File lub cokolwiek stworzyłeś InputStream z może być pusty plik lub ciąg lub cokolwiek innego. Ta pustka mogła być przyczyną problemu. Musisz więc sprawdzić swoje źródło InputStream.
Powiązane problemy