使用PHP访问名称中带有冒号的XML属性
我正在尝试从YouTube XML提要获取视频信息,例如标题和缩略图URL 让我们以这个提要为例:使用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); 但是,这似乎不
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编写第二个表达式(具有特定宽度的第一个缩略图)。