可以通过XPath()(YT频道提要)访问XML节点
被这一次难住了。在PHP中,我正在获取一个YouTube用户的vids提要并尝试访问节点,如下所示:
$url = 'http://gdata.youtube.com/feeds/api/users/HCAFCOfficial/uploads';
$xml = simplexml_load_file($url);
到目前为止,一切都很好。非常基本的东西。我可以通过运行以下命令看到数据返回:
echo '<p>Found '.count($xml->xpath('*')).' nodes.</p>'; //41
echo '<textarea>';print_r($xml);echo '</textarea>';
两者都打印我所期望的内容,而print_r
复制了XML结构。
但是,我不知道为什么返回零:
echo '<p>Found '.count($xml->xpath('entry')).'"entry" nodes.</p>';
在XML中有明显的entry
节点。这是通过运行以下命令确认的:
foreach($xml->xpath('*') as $node) echo '<p>['.$node->getName().']</p>';
...这会适当地输出"[Entry]"25次。那么,这可能是SimpleXML中的一个错误?这是更广泛的提要缓存系统的一部分,我对其他非YT提要没有任何问题,只有YT提要。
[更新]
This question显示,如果您这样做,它就会起作用
count($xml->entry)
但我很好奇为什么count($xml->xpath('entry'))
不起作用...
[更新2]
我可以很好地遍历YT的备用提要格式:
http://gdata.youtube.com/feeds/base/users/{user id}/uploads?alt=rss&v=2
Atom
发生这种情况是因为源是具有定义的默认命名空间的推荐答案文档。
<feed xmlns="http://www.w3.org/2005/Atom" ...
因为定义了名称空间,所以您还必须为XPath调用定义它。这样做很管用:
$url = 'http://gdata.youtube.com/feeds/api/users/HCAFCOfficial/uploads';
$xml = simplexml_load_file($url);
$xml->registerXPathNamespace('ns', 'http://www.w3.org/2005/Atom');
$results = $xml->xpath('ns:entry');
echo count($results);
这里要知道的主要一点是,SimpleXML尊重任何和所有定义的名称空间,您需要相应地处理它们,包括默认的名称空间。您将注意到您列出的第二个提要没有定义默认名称空间,因此XPath调用按原样运行良好。
相关文章