2013-05-17 34 views
1

我試圖解析Songkick API成藝術家即將到來的演出日期列表。從我所能找到的,以下應該做到這一點。問題是,它不起作用。基本Songkick API XML解析與循環

該代碼完全沒有返回。

$artist_id = "id"; 
$api_key = "API key"; 

$request_url = urlencode("http://api.songkick.com/api/3.0/artists/" . $artist_id . "/calendar.xml?apikey=" . $api_key); 
$load_api   = simplexml_load_file($request_url) or die("Songkick API error."); 

foreach ($load_api->event as $shows) { 
     $venue  = $shows->venue["displayName"]; 
     $city  = $shows->location["city"]; 
     $skdate = $shows->start["date"]; 
          $date = date("M d", strtotime($skdate)); 
     $artists = $shows->event->performance->artist["displayName"]; 

     echo $shows; 
     echo $city; 
     echo $date; 
     echo $artists; 

XML文件看起來像下面的幾個實例:

<event type="Concert" status="ok" displayName="Band with supporting acts" popularity="0.000495" uri="songkick address for this show" id="248"> 
     <metroArea displayName="SF Bay Area" uri="songkick address for this metro area" id="26330"> 
      <state displayName="CA"/> 
      <country displayName="US"/> 
     </metroArea> 
    </venue> 
    <start time="21:30:00" datetime="2013-05-31T21:30:00-0800" date="2013-05-31"/> 
    <location lat="37.7650545" lng="-122.3963593" city="San Francisco, CA, US"/> 
    <performance billingIndex="1" displayName="headliner" billing="headline" id="31239239"> 
     <artist displayName="Band Name" uri="uri for headling band" id="4114066"/> 
    </performance> 
    <performance billingIndex="2" displayName="Opener 1" billing="support" id="31239244"> 
     <artist displayName="Opener 1" uri="Opener 1 uri to songkick band page" id="4852118"/> 
    </performance> 
    <performance billingIndex="3" displayName="Opener 2" billing="support" id="31239249"> 
     <artist displayName="Opener 2" uri="Opener 2 uri to songkick band page" id="3527036"/> 
    </performance> 
</event> 

任何意見,將不勝感激......我不知所措。

謝謝!


更新:想通了!謝謝!

<?php 
    $artist_id = "*songkick artist id*"; 
    $api_key = "*api key*"; 
    $perm_link = "http://www.songkick.com/artists/$artist_id"; 

    $request_url = "http://api.songkick.com/api/3.0/artists/" . $artist_id . "/calendar.xml?apikey=" . $api_key; 
    $xml   = simplexml_load_file($request_url) or die("Songkick API error. Click <a href=\"" . $perm_link . "\" target=\"_blank\">Click here for show dates</a>."); // load file, or if error, print direct link to songkick page 

    foreach ($xml->results->event as $event) { 
     $skdate  = $event->start["date"]; 
      $date = date("M d", strtotime($skdate)); 
     $venue  = $event->venue["displayName"]; 
     $city  = $event->location["city"]; 
     $artists = $event->xpath("./performance/artist/@displayName"); 

     echo $venue, $city, $date . ":<br />" . implode(', ',$artists) . "<br />"; 
    } 

?> 
+0

幹得好,爲+1的答覆共享解決方案 – michi

回答

0

瞭解調試代碼:

  1. 你上面的XML是無效的 - >http://www.xmlvalidation.com
  2. 確保$load_api包含了什麼你認爲它通過使用var_dump($load_api);
  3. 確保PHP的錯誤報告處於最佳狀態,搜索SO如何做到這一點。
  4. 您的XML有多個<artist>節點,所以$artists必須設置不同。
  5. echo $shows這是回聲 - 沒有,因爲它有孩子,但沒有價值。

    $xml = simplexml_load_string($x); // assume **valid** XML in $x 
    
    foreach ($xml->event as $shows) { 
        $venue = $shows->venue["displayName"]; 
        $city = $shows->location["city"]; 
        $date = date("M d", strtotime($shows->start["date"])); 
        $artists = $shows->xpath("//artist/@displayName"); // returns array! 
    
        echo "$city $date: " . implode(', ',$artists) . "<br />"; 
    } 
    

看到它的工作:http://codepad.viper-7.com/yrAjYI

+0

感謝。我用XML驗證器檢查了從API返回的實際XML文件,沒有發現錯誤。另外,我發佈的XML只是一個節目的片段。 雖然我承認XML是新手,但我注意到songkick API看起來很奇怪,因爲標籤本身不包含任何值。所有的數據都包含在標籤屬性中,我認爲這是我無法獲得foreach()循環的原因。 – user2392467

+0

'foreach($ xml as $ show){ \t $ venue = $ show-> event-> venue [「displayName」]; } echo $ venue;' 返回一個場地名稱,但是下面的錯誤返回'Undefined Variable'。 'foreach($ xml-> event as $ show){ \t $ venue = $ show-> venue [「displayName」]; } echo $ venue;' – user2392467