2010-10-03 11 views
7

Estoy tratando de analizar un archivo de la web en Android utilizando el método DOM.Gestionar contenido comprimido en Android

El código en cuestión es:

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

Pero me estoy haciendo la siguiente excepción:

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

el archivo está siendo entregado a mí gzipped. Revisé el objeto is en el depurador y su longitud es de 6733 bytes (igual que la longitud del contenido del archivo en los encabezados de respuesta); sin embargo, si guardo el archivo en mi disco duro desde el navegador, su tamaño es 59114 bytes. Además, si lo subo a mi propio servidor, que no almacena gzip XML-s cuando les sirve y configura la URL, el código se ejecuta correctamente.

Supongo que lo que sucede es que Android intenta analizar la secuencia gzip.

¿Hay alguna manera de descomprimir la secuencia primero? ¿Alguna otra idea?

+1

mira este enlace http://stackoverflow.com/q/6717165/779408. Aquí se representa un método de compresión y descompresión. – breceivemail

Respuesta

20

Puede envolver el resultado de url.openStream() en un GZIPInputStream. por ejemplo:

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

Para detectar automáticamente cuándo hacerlo, utilice la cabecera HTTP Content-Encoding. por ejemplo:

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

Muchas gracias. Una pregunta más: ¿hay alguna manera de averiguar si una transmisión tiene gzip? – janosrusiczki

+0

También gracias por su edición en el tema de autodetección. – janosrusiczki

3

Por defecto, esta implementación de HttpURLConnection solicita que servidores utilizan la compresión gzip. Como getContentLength() devuelve el número de bytes transmitidos, no puede usar ese método para predecir cómo se pueden leer muchos bytes desde getInputStream(). En su lugar, lea la secuencia hasta agotarla: cuando read() devuelve -1. compresión Gzip se puede desactivar mediante el establecimiento de las codificaciones aceptables en la solicitud cabecera:

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

así que no hay nada que hacer.

Cuestiones relacionadas