PHPでXMLいろいろ

Youtubeに動画のメタデータをリクエストすると、XMLで返してくるので解析中。
解析は"$data=simplexml_load_file(“http://gdata.youtube.com/feeds/api/videos/”.$videoid);"でXMLを取得&パースして各種要素にアクセス。
で、Youtubeの一部動画は外部プレーヤーで再生できないようになってるから、それの判定プログラムを書いた。


<?xml version='1.0' encoding='UTF-8'?>
<entry xmlns='http://www.w3.org/2005/Atom' xmlns:app='http://purl.org/atom/app#' xmlns:media='http://search.yahoo.com/mrss/' xmlns:gd='http://schemas.google.com/g/2005' xmlns:yt='http://gdata.youtube.com/schemas/2007'>
	<id>http://gdata.youtube.com/feeds/api/videos/GF69Om75cT4</id>
	<published>2008-10-24T16:30:40.000Z</published>
	<updated>2010-04-26T10:40:56.000Z</updated>
	<app:control>
		<yt:state name='restricted' reasonCode='limitedSyndication'>
			Syndication of this video was restricted by its owner.
		</yt:state>
	</app:control>
	<category scheme='http://schemas.google.com/g/2005#kind' term='http://gdata.youtube.com/schemas/2007#video'/>
	<category scheme='http://gdata.youtube.com/schemas/2007/categories.cat' term='Film' label='映画とアニメ'/>

対象の動画のXMLの一部。
でこれが、単純に読み込んだ場合の一部

SimpleXMLElement Object (
	[id] => http://gdata.youtube.com/feeds/api/videos/GF69Om75cT4
	[published] => 2008-10-24T16:30:40.000Z
	[updated] => 2010-04-26T10:40:56.000Z
	[category] => Array (
		[0] => SimpleXMLElement Object (
			[@attributes] => Array (
				[scheme] => http://schemas.google.com/g/2005#kind
				[term] => http://gdata.youtube.com/schemas/2007#video
			)
		)

途中、<app:control>がごっそりなくなってる…
ググってみると、XMLのタグ名に:が付いてるのは名前空間らしく、$app=$data->children(“app”,true);でアクセスするみたい。
ただ、外部プレーヤーで再生出来る動画にこのタグはないから、if(!empty($app))で判定してやる必要がある。
あと、@attributes以下にアクセスするには

$yt=$app->children("yt",true);$yt->state->attributes()->reasonCode=="limitedSyndication"

みたいな感じでattributes関数を挟んでやる必要があるみたい。
面倒くさいなぁ…
追記:XMLの最後に<yt:noembed/>があるのを確認。どっちかっていうと、こいつを認識すればいいのか?
続きを読む PHPでXMLいろいろ