非常难过这个。在PHP中,我正在获取YouTube用户的vids feed并尝试访问节点,如下所示:
$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饲料。
[UPDATE]
This question表明如果你做了
就行了count($xml->entry)
但我很好奇为什么count($xml->xpath('entry'))
也不起作用......
[更新2]
我很高兴能够很好地遍历YT的备用Feed格式:
http://gdata.youtube.com/feeds/base/users/{user id}/uploads?alt=rss&v=2
答案 0 :(得分:1)
这种情况正在发生,因为feed是一个带有已定义的默认命名空间的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尊重任何和所有已定义的命名空间,您需要相应地处理它们,包括默认命名空间。您会注意到您列出的第二个Feed没有定义默认命名空间,因此xpath调用可以正常工作。