2008年4月27日日曜日

SimpleXML(PHP)で異なるネームスペースの要素にアクセス

スズキです。

WebAPIと呼ばれているものは、
レスポンスがXMLであることが多く、
PHPでその処理をするために、
SimpleXMLというものを使ってみました。
http://search.net-newbie.com/php/ref.simplexml.html

まあ、マニュアルどおり、直感的に使えてはいたのですが、
異なるネームスペースの要素にアクセスしようとすると、
それがなかなか取得できず、困ってしまいました。

とりあえず、最後にネームスペースの要素を取得をしている
コードをのせました。(まだまだ改善の余地はあると思います)
取得元XMLはYouTubeの特定ユーザーがアップロードした
ムービー一覧です。
http://code.google.com/apis/youtube/developers_guide_protocol.html#User_Uploaded_Videos

ポイントは3点です。

1. $ns = $xml->getDocNamespaces();
XMLで使われているネームスペースを取得
$ns["media"]
とprefixをキーに指定することで、該当するネームスペース
http://search.yahoo.com/mrss/
を取得することができます。

2. $group = $entry->children($ns["media"])
childrenの引数にネームスペースを指定することで、
そのネームスペースの要素を取得できるようになります。

3. $content->attributes() as $key => $value
さらに、その要素の異なるネームスペースを取得する場合は、
children/attributeの引数に該当するネームスペースを
指定します。
(デフォルトネームスペースの場合は何も指定しません)

ちょっと慣れるのに大変でした。
(なぜかXPathは使えなかった…、Windowsだからか?)

<?php
$url = "http://gdata.youtube.com/feeds/api/users/";
$url .= "GoogleDevelopers";
$url .= "/uploads";
$xml = simplexml_load_file($url);
$ns = $xml->getDocNamespaces();
foreach ($xml->entry as $entry) {
  $group = $entry->children($ns["media"])->group;
  foreach ($group->content as $content) {
    foreach($content->attributes() as $key => $value) {
      switch($key) {
        case "type":
          $type = $value;
          break;
        case "url":
          $url = $value;
          break;
      }
    }
    if($type == "application/x-shockwave-flash") {
      print($url);
      print("<br />");
    }
  }
}
?>

--

http://suz-lab.blogspot.com/

0 コメント: