2012-04-05 15 views
20

Ich versuche zu analysieren und XML response, aber ich versage kläglich. Ich dachte zunächst , dass die xml wurde gerade nicht in der Antwort zurückgegeben, so dass ich den Code unten mit einem direkten Link zu meiner xml Datei online. Ich bin in der Lage, die XML zum Bildschirm ohne Probleme zu drucken. Wenn ich jedoch meine Parse-Methode aufrufen, bekomme ich Vorzeitiges Ende der Datei.Warum erhalte ich diesen Fehler Vorzeitiges Ende der Datei?

Es funktioniert, wenn ich die URL direkt übergeben:

  • builder.parse ("");

aber schlägt fehl, wenn ich einen Inputstream übergeben:

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

Die Fehler Ich erhalte:

[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

Haben Sie die zu analysierende XML-Datei? Vorzeitiges Ende der Datei zeigt an, dass Ihre XML-Datei nicht vollständig war. Da Sie hier eine URL-Verbindung verwenden, vermute ich Netzwerkprobleme. Der beste Weg, um dieses Problem zu lösen, ist, diese XML-Datei mit Hilfe von Wireshark oder TCP-Monitor Art von Tools zu erfassen und dann zu überprüfen, ob es abgeschlossen ist – NiranjanBhat

+0

@NiranjanBhat. Ja, das XMl ist vollständig und gültig. Ich habe dieses XML mit einem direkten Link analysiert. Es scheint, der Fehler tritt nur auf, wenn ein InputStream verwendet wird. – Fabii

+0

Warum machen Sie einen POST, aber senden keine Daten? – EJP

Antwort

25

Wenn Sie das tun,

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

Sie verbrauchen alles in instream, so instream ist leer. Wenn Sie dies jetzt versuchen,

Document doc = builder.parse(instream); 

Die Analyse wird fehlschlagen, weil Sie es einen leeren Stream übergeben haben.

+0

Ich habe die Anweisung readLine() entfernt. Aber ich bekomme immer noch den gleichen Fehler. Wenn ich den direkten Link zu der XML liefern, funktioniert es. Wenn ich versuche, mit connection.getInputStream() zu arbeiten, wenn dieser Fehler ausgelöst wird. – Fabii

+0

Es gab auch ein Problem mit dem Stream, der zurückgegeben wurde. Problem gelöst. – Fabii

+2

@Fabii Was war das Problem mit dem Stream zurückgegeben wurde? Ich möchte es wissen, weil ich das gleiche Problem bekomme. – NobleUplift

0

stieß ich auf die gleichen Fehler, und könnte leicht finden, was das Problem, indem Sie die Ausnahme war:

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

Oder stattdessen den Fehler zu protokollieren, können Sie throw es und catch es, wo Sie den Griff Einträge, so dass Sie den Eintrag selbst ausdrucken können, um einen besseren Hinweis auf den Fehler zu bekommen.

1

Sie erhalten den Fehler, weil der SAXBuilder nicht intelligent genug ist, um mit "leeren Zuständen" umzugehen. Es sucht also mindestens nach einer <xml ..> Deklaration, und wenn das keine Antwort auf Daten verursacht, erstellt es die Ausnahme, die Sie sehen, anstatt den leeren Zustand zu melden.

2

Für diejenigen, die diesen Beitrag für Antwort erreicht:

Dies geschieht vor allem, weil die InputStream der DOM-Parser raubend ist leer

Also in dem, was ich über lief, könnte es zwei Situationen:

  1. Die InputStream, die Sie in den Parser übergeben haben, wurde verwendet und somit geleert.
  2. Die File oder was auch immer Sie die InputStream erstellt haben, kann eine leere Datei oder String oder was auch immer sein. Die Leere könnte der Grund für das Problem sein. Also müssen Sie Ihre Quelle der InputStream überprüfen.
Verwandte Themen