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

使用PHP访问名称中带有冒号的XML属性,php,xml,simplexml,Php,Xml,Simplexml,我正在尝试从YouTube XML提要获取视频信息,例如标题和缩略图URL 让我们以这个提要为例: 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); 但是,这似乎不

我正在尝试从YouTube XML提要获取视频信息,例如标题和缩略图URL

让我们以这个提要为例:
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表的media:group部分

本质上,我试图得到这两个值:

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;

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

  • http://www.w3.org/2005/Atom
  • http://purl.org/atom/app#
    带有前缀
    app
  • http://search.yahoo.com/mrss/
    带有前缀
    媒体
  • http://schemas.google.com/g/2005
    带前缀
    gd
  • http://gdata.youtube.com/schemas/2007
    带前缀
    yt
名称空间前缀是实际名称空间的别名,它仅对文档有效,并且可以对子节点进行更改。下一个提要可以将前缀
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"

1) 不要对SimpleXML使用
print\u r()
var\u dump()
等;他们会对你撒谎。2) 在StackOverflow中搜索“simplexml冒号”、“simplexml命名空间”等;这个问题已经被问了一百万次了。好吧,另一个答案帮我弄明白了。谢谢。很好的介绍,但是提议的解决方案引入了OP以前没有使用的两种技术(DOM和XPath),而不仅仅是使用SimpleXML本身的名称空间函数(
->children($ns)
->attributes($ns)
)。Yep@IMSoP是正确的。这就是我最后做的:
$sxml->children('media',true)->group->title用于标题和
$sxml->children('media',true)->组->缩略图->属性()->url
获取url。SimpleXML变量不太稳定,对XML名称空间前缀和缺少元素(外部资源)的有效更改可能会导致PHP错误。@ThW是的,在
->children()
中使用
true
意味着依赖前缀不改变;否则,它需要完整的名称空间URI,因此与XPath一样安全。如果我没有弄错的话,大多数遍历XML的方法都会遇到缺少元素(无效输入)的问题。我还要注意,SimpleXML还有一个
->xpath()
方法,它需要的样板文件(没有额外的对象)比DOM版本少。SimpleXML xpath()方法不能返回标量,只能返回节点列表。列表可以为空,因此需要额外的验证。谈到样板,请尝试使用SimpleXml编写第二个表达式(具有特定宽度的第一个缩略图)。