Проблемы с gzipped XML-файлами с curl PHP

Я пытаюсь захватить данные из файла xml.gz с помощью curl. Я могу загрузить файл, но не могу получить полезный XML с любыми моими попытками. Когда я пытаюсь распечатать XML, я получаю длинный список искаженных специальных символов, таких как:

‹ì½ûrâÈ–7ú?E~{Çž¨Ši°î—Ù5=ÁÍ6]`Ø€ë²ãDLÈ u 

Есть простой способ просто распаковать и закодировать этот xml? Возможно через SimpleXML? Файлы большие и требуют аутентификации. Вот мой текущий код:

 $username='username'; $password='password'; $location='http://www.example.com/file.xml.gz'; $ch = curl_init (); curl_setopt($ch,CURLOPT_URL,$location); curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); curl_setopt($ch,CURLOPT_USERPWD,"$username:$password"); curl_setopt($ch, CURLOPT_TIMEOUT, 60); curl_setopt($ch, CURLOPT_HEADER, 0); $xmlcontent = curl_exec ($ch); curl_close($ch); print_r($xmlcontent); 

Спасибо за вашу помощь!

Related of "Проблемы с gzipped XML-файлами с curl PHP"

Вам нужно будет передать строку через gzuncompress : http://www.php.net/manual/en/function.gzuncompress.php

Сначала вам нужно сохранить файл на диск. Поскольку это сжатие gz, вам нужно распаковать его, прежде чем вы сможете получить доступ к (несжатому) XML. Это можно сделать с помощью zlib: // – bzip2: // – zip: // – Сжатие потоков в PHP:

 $file = 'compress.zlib://file.xml.gz'; ################ $xml = simplexml_load_file($file); 

Чтобы это работало, вам необходимо установить / настроить расширение ZLib .

Wrapper означает, что вы сначала не создаете несжатый вариант этого файла (создайте второй файл, который также может быть решением), но оболочка несжимает данные этого файла прозрачно «на лету», чтобы библиотека simplexml могла работать несжатый XML (и в этом нуждается библиотека: несжатый XML).

См. Также:

  • Сортировка и группировка данных SimpleXML (пример использования файла SimpleXMLElement с SimpleXMLElement )
  • Разбор чрезвычайно больших XML-файлов в php (пример использования файла XMLReader с XMLReader )

Не знаю, почему, но ни один из других ответов не помог мне в конце. zlib был установлен на сервере, но функция gzdecode () не была определена в библиотеке, и gzuncompress дал мне ошибки, как и compress.zlib: //. Они могут работать для вас так, дайте им попробовать.

Если вам нужно проверить, установлен ли zlib, этот ответ stackoverflow или этот ответ может помочь. Они предоставляют этот скрипт:

 <?php echo phpversion().", "; if (function_exists("gzdecode")) { echo "gzdecode OK, "; } else { echo "gzdecode no OK, "; } if (extension_loaded('zlib')) { echo "zlib extension loaded "; } else { echo "zlib extension not loaded "; } ?> 

Этот сайт дает другой скрипт, который показывает, какие функции zlib установлены:

 var_dump(get_extension_funcs('zlib')); 

РЕШЕНИЕ!!! Эти две функции сделали трюк для меня. Просто скручивайте или используйте file_get_contents для захвата xml-файла, затем используйте этот скрипт:

 $xmlcontent = gzinflate(substr($xmlcontent,10,-8)); 

ИЛИ используйте этот скрипт для захвата xml-файла и получения содержимого (см. Подробнее здесь ):

 $zd = gzopen($filename,"r"); $contents = gzread($zd,$fileSize); gzclose($zd); 

Спасибо всем, кто помог мне получить этот ответ. Надеюсь, это поможет кому-то еще!

Я предлагаю вам просто распаковать полученный результат:

 //[...] $xmlcontent = gzdecode ( curl_exec($ch) ); curl_close($ch); print_r($xmlcontent); 

Очевидно, вы должны выполнить дополнительную проверку ошибок, это всего лишь сокращенный общий подход.

Обратите внимание, что есть две аналогичные функции, предоставляемые php:

  • gzuncompress()
  • gzdecode()

Скорее всего, вы должны использовать второй, если файл действительно является физическим сжатым файлом gzip, поставляемым сервером http.