2012-04-05 38 views
20

Tôi đang cố gắng phân tích cú pháp và XML response, nhưng tôi thất bại thảm hại. Ban đầu, tôi nghĩ rằng rằng xml không được trả lại trong phản hồi, vì vậy tôi đã tạo mã bên dưới với liên kết trực tiếp đến tệp trực tuyến xml của tôi. Tôi có thể in XML vào màn hình mà không gặp vấn đề gì. Tuy nhiên, khi tôi gọi phương thức phân tích cú pháp của mình, tôi nhận được Kết thúc sớm của tệp.Tại sao tôi nhận được lỗi này Kết thúc sớm của tệp?

Nó hoạt động nếu tôi vượt qua URL trực tiếp:

  • builder.parse ("");

nhưng không khi tôi đã thông qua một 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); 
    } 
    

Các lỗi Tôi nhận:

[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

Bạn có tệp XML bạn đang cố gắng phân tích cú pháp không. Kết thúc sớm của tệp cho biết tệp XML của bạn chưa hoàn chỉnh, vì bạn đang sử dụng kết nối URL ở đây, tôi nghi ngờ sự cố mạng. Cách tốt nhất để giải quyết vấn đề này là nắm bắt tệp XML này bằng cách sử dụng công cụ theo dõi hoặc công cụ giám sát TCP và sau đó kiểm tra xem nó có hoàn thành – NiranjanBhat

+0

@NiranjanBhat hay không. Có XMl là đầy đủ và hợp lệ. Tôi đã phân tích cú pháp xml này bằng một liên kết trực tiếp. Có vẻ như lỗi này chỉ phát sinh khi sử dụng InputStream. – Fabii

+0

Tại sao bạn làm POST nhưng không gửi bất kỳ dữ liệu nào? – EJP

Trả lời

25

Khi bạn làm điều này,

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

Bạn tiêu thụ mọi thứ trong instream, vì vậy instream trống. Bây giờ, khi cố gắng thực hiện việc này,

Document doc = builder.parse(instream); 

Việc phân tích cú pháp sẽ không thành công vì bạn đã vượt qua luồng trống.

+0

Tôi đã xóa câu lệnh readLine(). Nhưng tôi vẫn nhận được lỗi tương tự. Nếu tôi cung cấp liên kết trực tiếp đến xml nó hoạt động. Nếu tôi cố gắng xử lý bằng cách sử dụng connection.getInputStream() nếu ném lỗi đó. – Fabii

+0

Đã xảy ra sự cố với luồng đang được trả lại. Đã giải quyết được sự cố. – Fabii

+2

@Fabii Sự cố với luồng đang được trả về là gì? Tôi muốn biết vì tôi nhận được cùng một vấn đề. – NobleUplift

0

tôi đi qua các lỗi tương tự, và có thể dễ dàng tìm ra vấn đề bằng cách đăng nhập trừ là gì:

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

Hoặc, thay vì đăng nhập lỗi, bạn có thể throw nó và catch nó nơi bạn xử lý các mục nhập, vì vậy bạn có thể in mục nhập để có chỉ báo tốt hơn về lỗi.

1

Bạn đang gặp lỗi vì SAXBuilder không đủ thông minh để đối phó với "trạng thái trống". Vì vậy, nó tìm kiếm ít nhất một tuyên bố <xml ..> và khi điều đó gây ra phản hồi không có dữ liệu, nó tạo ra ngoại lệ mà bạn thấy thay vì báo cáo trạng thái trống.

2

Đối với những người đạt bài này cho trả lời:

Điều này xảy ra chủ yếu là do các InputStream phân tích cú pháp DOM được tiêu thụ rỗng

Vì vậy, trong những gì tôi chạy qua, có thể có hai trường hợp:

  1. InputStream bạn đã chuyển vào trình phân tích cú pháp đã được sử dụng và do đó làm trống.
  2. File hoặc bất kỳ thứ gì bạn đã tạo InputStream từ có thể là tệp hoặc chuỗi trống hoặc bất kỳ thứ gì. Sự trống rỗng có thể là nguyên nhân gây ra vấn đề. Vì vậy, bạn cần kiểm tra nguồn của mình trong số InputStream.
Các vấn đề liên quan