2012-04-05 82 views
20

我試圖解析和XML response,但我失敗了。我原本以爲 ,xml只是沒有被回覆,所以我製作了下面的代碼,直接鏈接到我的xml在線文件。我可以打印XML進行屏幕顯示,沒有任何問題。但是,當我打電話給我的解析方法時,我收到文件過早結束。爲什麼我得到這個錯誤文件過早結束?

如果我通過直接的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) 
+0

你有XML文件,你正試圖解析。文件過早結束表示你的XML文件不完整,因爲你在這裏使用URL連接,我懷疑網絡問題。解決此問題的最佳方法是使用wireshark或TCP監視器類型的工具捕獲此XML文件,然後檢查它是否完整 – NiranjanBhat 2012-04-05 04:48:45

+0

@NiranjanBhat。是的,XMl是完整且有效的。我有一個直接的鏈接解析這個XML。它似乎只有在使用InputStream時纔會出現錯誤。 – Fabii 2012-04-05 04:56:49

+0

你爲什麼要做POST但不發送任何數據? – EJP 2017-10-11 00:36:48

回答

25

當你做到這一點,

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

你消耗河道內一切,所以河道內是空的。現在,當嘗試這樣做,

Document doc = builder.parse(instream); 

解析會失敗,因爲你通過一個空流。

+0

我刪除了readLine()語句。但我仍然遇到同樣的錯誤。如果我提供直接鏈接到它的xml它的工作。如果我嘗試使用connection.getInputStream()處理,如果拋出該錯誤。 – Fabii 2012-04-05 15:07:32

+0

還有一個正在返回的流問題。問題解決了。 – Fabii 2012-04-05 18:35:43

+2

@Fabii流被返回的問題是什麼?我想知道,因爲我遇到了同樣的問題。 – NobleUplift 2015-04-28 14:06:36

0

我碰到了同樣的錯誤,並可以很容易地找到什麼是登錄異常問題:

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

或者,而不是記錄錯誤,您可以throwcatch它,你處理條目,因此您可以打印條目本身以更好地指示錯誤。

1

由於SAXBuilder沒有足夠的智能來處理「空白狀態」,所以出現錯誤。所以它至少會查找一個<xml ..>聲明,並且當它導致無數據響應時,它會創建您看到的異常,而不是報告空狀態。

2

對於那些誰達到這個職位答:

這主要是因爲該InputStream DOM解析器會消耗空

所以在我跑過,可能有兩種情況:

  1. 您傳遞給解析器的InputStream已被使用並因此被清空。
  2. File或任何你創建的InputStream可能是一個空文件或字符串或任何其他。空虛可能是導致問題的原因。所以你需要檢查你的來源InputStream
相關問題