Обработка сжатого контента на Android - PullRequest
9 голосов
/ 03 октября 2010

Я пытаюсь проанализировать файл из Интернета на Android, используя метод DOM.

Код, о котором идет речь:

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

Но я получаю следующее исключение:

V/XMLParseTest1(  846):Exception = org.xml.sax.SAXParseException: name expected (position:START_TAG <null>@2:176 in java.io.InputStreamReader@43ea4538) 

Файл передается мне в архиве. Я проверил объект is в отладчике, и его длина составляет 6733 байта (то же самое, что длина содержимого файла в заголовках ответа), однако, если я сохраняю файл на жесткий диск из браузера, его размер составляет 59114 байта , Кроме того, если я загружаю его на свой собственный сервер, который не распаковывает XML-файлы, когда он их обслуживает, и задаю URL, код работает нормально.

Я предполагаю, что происходит то, что Android пытается проанализировать сжатый поток.

Есть ли способ сначала распаковать поток? Есть еще идеи?

Ответы [ 2 ]

22 голосов
/ 03 октября 2010

Вы можете обернуть результат url.openStream() в GZIPInputStream .Например:

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

Чтобы автоматически определять, когда это делать, используйте HTTP-заголовок Content-Encoding.например:

URLConnection connection = url.openConnection();
InputStream stream = connection.getInputStream();
if ("gzip".equals(connection.getContentEncoding())) {
  stream = new GZIPInputStream(stream));
}
InputSource is = new InputSource(stream);
3 голосов
/ 28 октября 2011

По умолчанию эта реализация запросов HttpURLConnection серверы используют сжатие gzip. Так как getContentLength () возвращает количество переданных байтов, вы не можете использовать этот метод, чтобы предсказать, как многие байты могут быть прочитаны из getInputStream (). Вместо этого прочитайте это поток, пока он не исчерпан: когда read () возвращает -1. Сжатие Gzip можно отключить, установив приемлемые кодировки в запросе заголовок:

urlConnection.setRequestProperty («Accept-Encoding», «identity»);

так что ничего не нужно делать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...