2010-10-03 36 views
7

Tôi đang cố gắng phân tích cú pháp tệp từ web trên Android bằng phương pháp DOM.Xử lý nội dung gzipped trên Android

Các mã trong câu hỏi là:

try { 
    URL url = new URL("https://www.beatport.com/en-US/xml/content/home/detail/1/welcome_to_beatport"); 

    InputSource is = new InputSource(url.openStream()); 

    DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance(); 
    DocumentBuilder db = dbf.newDocumentBuilder(); 
    Document document = db.parse(is); 
    document.getDocumentElement().normalize(); 
} catch(Exception e) { 
    Log.v(TAG, "Exception = " + e); 
} 

Nhưng tôi nhận được ngoại lệ sau đây:

V/XMLParseTest1( 846):Exception = org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@2:176 in [email protected]) 

Các tập tin đang được giao cho tôi gzip. Tôi đã kiểm tra đối tượng is trong trình gỡ lỗi và độ dài của nó là 6733 byte (giống như độ dài nội dung của tệp trong tiêu đề phản hồi) tuy nhiên nếu tôi lưu tệp vào đĩa cứng của mình từ trình duyệt, kích thước của nó là 59114 byte. Hơn nữa nếu tôi tải nó lên máy chủ của riêng tôi mà không gzip XML-s khi nó phục vụ họ và thiết lập URL mã chạy tốt.

Tôi đoán rằng điều xảy ra là Android cố gắng phân tích cú pháp luồng đã nén.

Có cách nào để giải nén luồng đầu tiên không? Bất kỳ ý tưởng nào khác?

+1

xem liên kết này http://stackoverflow.com/q/6717165/779408. Phương pháp nén và giải nén được biểu diễn ở đó. – breceivemail

Trả lời

20

Bạn có thể bọc kết quả của url.openStream() trong một GZIPInputStream. ví dụ:

InputSource is = new InputSource(new GZIPInputStream(url.openStream())); 

Để tự động phát hiện khi nào, hãy sử dụng tiêu đề HTTP Mã hóa nội dung. ví dụ:

URLConnection connection = url.openConnection(); 
InputStream stream = connection.getInputStream(); 
if ("gzip".equals(connection.getContentEncoding())) { 
    stream = new GZIPInputStream(stream)); 
} 
InputSource is = new InputSource(stream); 
+0

Cảm ơn rất nhiều. Một câu hỏi nữa: có cách nào để tìm hiểu xem luồng có được nén không? – janosrusiczki

+0

Cũng cảm ơn bạn đã chỉnh sửa về sự cố tự động phát hiện. – janosrusiczki

3

Theo mặc định, thực hiện này của HttpURLConnection yêu cầu rằng máy chủ sử dụng nén gzip. Vì getContentLength() trả về số lượng byte được truyền đi, bạn không thể sử dụng phương thức đó để dự đoán cách một byte có thể được đọc từ getInputStream() như thế nào . Thay vào đó, hãy đọc luồng cho đến khi nó cạn kiệt: khi read() trả về -1. Bạn có thể tắt tính năng nén Gzip bằng cách đặt mã hóa được chấp nhận theo yêu cầu tiêu đề:

urlConnection.setRequestProperty ("Accept-Encoding", "identity");

vì vậy không cần phải làm gì cả.

Các vấn đề liên quan