【问题标题】:Parsing xml with php and curl - Expedia API使用 php 和 curl 解析 xml - Expedia API
【发布时间】:2014-02-06 14:39:54
【问题描述】:

我想从我所做的 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

【问题讨论】:

  • 也许你不能只做 echo $hotels。尝试使用die(var_dump($hotels)),您将看到 $hotels 是什么类型的对象以及它包含什么。我不完全了解该函数,但似乎您可能会从中获取一个数组或一个对象,您必须对其进行迭代才能加载其内容。
  • simplexml_load_file() 调用与其他一切有什么关系?
  • 我已从此代码中删除了您的 API 密钥。如果那是一个实时密钥,您可能想要更改它。

标签: php xml api curl


【解决方案1】:

如果您仔细查看已链接的指南,您会发现该指南告诉您:

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

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

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

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

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

【讨论】:

  • 感谢您的回复。我试过 foreach 循环无济于事。我也尝试使用 var 转储访问我的 $hotels 变量,但返回的是 bool(false)。有什么指点吗??
  • 嗯,这意味着您的 simplexml_load_file 返回 false。可能它无法读取该网址。该网址与浏览器配合良好,所以...您确定此功能能够读取网址吗?在指南中,此功能用于简单文件。
【解决方案2】:

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

如果是,则从您的代码中删除此行:

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

然后从CURLOPT_ENCODING 中删除 gzip。而是使用空,这意味着接受任何编码。

curl_setopt($ch,CURLOPT_ENCODING , "");

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

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

curl_setopt($ch,CURLOPT_VERBOSE, true);

【讨论】:

    【解决方案3】:

    您拥有的 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 />";
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-12-11
      • 2011-09-20
      • 1970-01-01
      • 2011-03-12
      • 1970-01-01
      • 2013-02-27
      • 2013-06-09
      相关资源
      最近更新 更多