使用PHP访问名称中带冒号的XML属性

时间:2014-01-25 01:01:01

标签: php xml simplexml

我正在尝试从YouTube XML Feed中获取视频信息,例如标题和缩略图网址。

我们以此Feed为例: http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8

这是我现在的代码:

$videoURL = 'http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8';
$sxml = simplexml_load_file($videoURL);
print_r($sxml);

但是,这似乎不包括媒体:xml表的组部分。

基本上,我正试图获得这两个值:

entry -> media:group -> media:title
entry -> media:group -> media:thumbnail

编辑:这是我最后阅读其他类似问题的解决方案。

$videoTitle = $sxml->children('media', true)->group->title;
$videoThumbnail = $sxml->children('media', true)->group->thumbnail->attributes()->url;

1 个答案:

答案 0 :(得分:0)

标记名称中的冒号将名称空间前缀与本地元素或属性名称分开。问题中的提要有几个名称空间。

  • http://www.w3.org/2005/Atom
  • http://purl.org/atom/app#,前缀为app
  • http://search.yahoo.com/mrss/,前缀为media
  • http://schemas.google.com/g/2005,前缀为gd
  • http://gdata.youtube.com/schemas/2007,前缀为yt

名称空间前缀是实际名称空间的别名,它仅对文档有效,并且可以针对子节点进行更改。下一个Feed可以使用前缀atom作为http://www.w3.org/2005/Atom。因此,根据文档中的命名空间前缀是一个坏主意。

如果使用Xpath从文档中获取元素,则可以为使用的命名空间注册自己的前缀。以下示例直接将媒体rss标题和大缩略图的URL作为字符串。如果元素不存在,则返回空字符串。

$videoURL = 'http://gdata.youtube.com/feeds/api/videos/CevxZvSJLk8';
$dom = new DOMDocument();
$dom->load($videoURL);

$xpath = new DOMXPath($dom);
$xpath->registerNamespace('mrss', 'http://search.yahoo.com/mrss/');

var_dump(
  $xpath->evaluate('string(//mrss:title)', NULL, FALSE),
  $xpath->evaluate('string(//mrss:thumbnail[@width="480"]/@url)', NULL, FALSE)
);

输出:

string(28) "Katy Perry - Roar (Official)"
string(40) "http://i1.ytimg.com/vi/CevxZvSJLk8/0.jpg"