使用php和curl解析xml - Expedia API

时间:2014-02-06 14:39:54

标签: php xml api curl

我想从我所做的API调用中提取一些数据。使用PHP CURL。

这是我的代码:

    <?PHP
    //use latest minorRev 14
    $url  ='http://api.ean.com/ean-services/rs/hotel/v3/list?minorRev=99';
    $url .= '&apiKey=' . $apiKey;
    $url .= '&cid=55505';
    $url .= '&locale=en_US&city=Dallas&stateProvinceCode=TX&countryCode=US&numberOfResults=3';
    $url .= '&searchRadius=50';
    //using the cache returns results much faster
    $url .= '&supplierCacheTolerance=MED_ENHANCED';
    //dates and occupancy
    $url .='&arrivalDate=09/04/2014&departureDate=09/05/2014&room1=2';
    $header[] = "Accept: application/json";
    $header[] = "Accept-Encoding: gzip";
    $ch = curl_init();
    curl_setopt( $ch, CURLOPT_HTTPHEADER, $header );
    curl_setopt($ch,CURLOPT_ENCODING , "gzip");
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
    curl_setopt( $ch, CURLOPT_URL, $url );
    curl_setopt( $ch, CURLOPT_RETURNTRANSFER, true );
    $response = json_decode(curl_exec($ch));
    $response = curl_exec($ch);

    ?>
    <html>
    <body>
        <table>
            <Tr>
                <TD>

                    <?PHP

                    $hotels = simplexml_load_file('http://api.ean.com/ean-services/rs/hotel/v3/list?minorRev=99&apiKey=7z6tduachrht362dpnsch34v&cid=55505&locale=en_US&city=Dallas&stateProvinceCode=TX&countryCode=US&numberOfResults=3&searchRadius=50&supplierCacheTolerance=MED_ENHANCED&arrivalDate=09/04/2014&departureDate=09/05/2014&room1=2');

                    echo $hotels;

                    ?>


                </TD>
            </Tr>
        </table>

为什么我没有使用simplexml_load_file函数返回任何内容?

我也将此作为指南 - http://blog.teamtreehouse.com/how-to-parse-xml-with-php5

3 个答案:

答案 0 :(得分:0)

如果您仔细查看已关联的指南,您会看到指南告诉您这样做:

echo $mysongs->song[0]->artist;

这意味着simplexml_load_file的返回不是简单的字符串,它是一个对象,您必须访问其数据。我不知道怎么做,但它看起来可能与此类似:

foreach($hotels as $hotel){
    echo $hotel;
}

您必须更好地阅读使用指南。

正如我在评论中所说,只要您不确定如何访问或使用对象,使用代码die(var_dump($object));运行程序可以帮助您获取该对象的大量信息,如何访问它。

答案 1 :(得分:0)

您是否正确地从$response返回了simplexml_load_file

如果是,请从代码中删除此行:

$header[] = "Accept-Encoding: gzip";

CURLOPT_ENCODING中删除gzip。而是使用empty表示接受任何编码。

curl_setopt($ch,CURLOPT_ENCODING , "");

此外,在对响应执行json_decode之前,只需将其打印或保存到文件中,然后观察是否从服务器返回了有效的json对象。

最后,通过启用详细模式来调试卷曲请求。

curl_setopt($ch,CURLOPT_VERBOSE, true);

答案 2 :(得分:0)

您拥有的API是以 JSON 格式返回数据而不是 XML

$hotels = file_get_contents($url);
echo $hotels;

这就是simplexml_load_file失败的原因,您必须使用json_decode代替


您以这种方式解析JSON数据:

$data_json = json_decode(file_get_contents($url));  
$HotelListResponse = $data_json->{"HotelListResponse"};
$HotelList = $HotelListResponse->{"HotelList"};
$HotelSummary = $HotelList->{"HotelSummary"};
var_dump($HotelSummary);

等等


您可以打印酒店名称:

foreach($HotelSummary as $summary){
    $hotelName = $summary->{"name"};
    echo $hotelName."<br />";
}