PHP と AS3 の Namespace の処理

PHP/AS3 共に XML Namespace の記述方法をいつも忘れるのでメモ。
今回の目標は Flickr の latest XML から <media:thumbnail> の url と width と height を取得すること。

AS3 の場合は Namespace オブジェクトを作成し、それを基に特定のノードにアクセスする。

var _xml:String            = "http://api.flickr.com/services/feeds/photos_public.gne?id=53418554@N00&lang=en-us&format=rss_200";
var _urlRequest:URLRequest = new URLRequest();
_urlRequest.url            = _xml;
var _urlLoader:URLLoader   = new URLLoader();
_urlLoader.addEventListener(Event.COMPLETE, _loadCompleteHandler, false, 0, true);
_urlLoader.load(_urlRequest);
function _loadCompleteHandler(evt:Event):void
{
	var _xml:XML = XML(evt.target.data);
	_parseXml(_xml);
}
function _parseXml(xml:XML):void
{
	var _media:Namespace  = new Namespace("http://search.yahoo.com/mrss/");
	var _mainNodeNum:uint = xml..item.length();
	for(var _i:uint = 0; _i < _mainNodeNum; _i ++)
	{
		var _item:XML = xml..item[_i];
		var _thumbnail:String       = _item._media::thumbnail.@url;
		var _thumbnailWidth:Number  = _item._media::thumbnail.@width;
		var _thumbnailHeight:Number = _item._media::thumbnail.@height;
		trace(_thumbnail, _thumbnailWidth, _thumbnailHeight);
	}
}

PHP の場合は SimpleXMLElement オブジェクトの registerXPathNamespace メソッドを使う。
今回は Zend_Http_Client と絡めて使ってみる。

require_once('Zend/Http/Client.php');
$_gatwayUri = 'http://api.flickr.com/services/feeds/photos_public.gne?id=53418554@N00&lang=en-us&format=rss_200';
$_client    = new Zend_Http_Client($_gatwayUri);
$_response  = $_client->request('GET');
if($_response->isSuccessful()) {
    $_body = $_response->getBody();
    if(strlen($_body) > 0) {
        $_xml = simplexml_load_string($_body);
        $_xml->registerXPathNamespace('media', 'http://search.yahoo.com/mrss/');
        $_items = $_xml->xpath('/rss/channel/item');
        foreach($_items as $_item) {
            $_content      = $_item->xpath('media:thumbnail');
            $_thumbnailObj = $_content[0];
            $_thumbnail    = (string) $_thumbnailObj['url'];
            $_width        = (integer) $_thumbnailObj['width'];
            $_height       = (integer) $_thumbnailObj['height'];
            echo '<pre>';
            var_dump($_thumbnail);
            var_dump($_width);
            var_dump($_height);
            echo '</pre>';
        }
    }
}

あー、忘れる。

ページの一番上へ移動