Справка с извлечением XML через cURL

#php #xml #parsing #curl

#php #xml #синтаксический анализ #curl

Вопрос:

У меня возникли проблемы со следующим php-кодом:

 <?php
$url = "http://api.ean.com/ean-services/rs/hotel/v3/list?    minorRev=1amp;cid=55505amp;apiKey=58x5kuujub8xbb5tzv3a2a8qamp;locale=en_USamp;currencyCode=USDamp;xml=    <HotelListRequest><destinationString>Seattle</destinationString>    <arrivalDate>08/01/2011</arrivalDate><departureDate>08/03/2011</departureDate><RoomGroup>    <Room><numberOfAdults>2</numberOfAdults></Room></RoomGroup>    <numberOfResults>1</numberOfResults></HotelListRequest>";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_TIMEOUT, 15);
$contents = curl_exec ($ch);
echo $contents;
curl_close($ch);
?>
  

Проблема в том, что $ contents содержит разметку, которая вообще не является XML, поэтому я не могу ее разобрать. Это сбивает с толку, потому что при вводе URL-адреса в адресной строке моего браузера будет отображаться XML-документ, но, похоже, я не могу получить действительный XML-документ с этим кодом.

Вот фрагмент строки, которая возвращается:

 {"HotelListResponse":{"customerSessionId":"0ABAA83D-4428-4913-0382-28FBB1901EFC","numberOfRoomsRequested":1,"moreResultsAvailable":true,"cacheKey":"-32344284:1303828fbb1:-1ef9","cacheLocation":"10.186.168.61:7305","HotelList":{"@size":"1","HotelSummary":{"@order":"0"
  

Может кто-нибудь объяснить мне, где я ошибаюсь?

Спасибо.

Ответ №1:

Вместо того, чтобы пытаться получить XML, который может быть не предоставлен, вы всегда можете работать с тем, что у вас есть, которое, по-видимому, является JSON.

$response = json_decode( $contents, true );

Это даст вам ассоциативный массив ваших данных, с которым может быть намного проще работать.

Ответ №2:

Попробуйте удалить пробелы: «/v3/list? minorRev=1» -> «/v3/list?minorRev=1»

  1. Сделайте свой URL правильным, например

    $url = 'http://api.ean.com/ean-services/rs/hotel/v3/list?type=xmlamp;minorRev=1amp;cid=55505amp;apiKey=58x5kuujub8xbb5tzv3a2a8qamp;locale=en_USamp;currencyCode=USDamp;xml=Seattle08/01/201108/03/20112 1';

  2. Добавьте опцию для приема только xml — в браузере у нас есть такой заголовок — в curl — нет:

    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Accept: application/xml'));

  3. ПРИБЫЛЬ!!!

Комментарии:

1. Ты гений! Вы решили мою главную проблему, большое вам спасибо!

2. @liveandream tnx, просто нажмите эту кнопку «Вверх» 🙂