无法通过xpath()(YT频道馈送)访问XML节点

时间:2014-04-05 11:33:28

标签: php xml xpath youtube simplexml

非常难过这个。在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

1 个答案:

答案 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调用可以正常工作。