被这个难倒了。在PHP中,我正在获取YouTube用户的视频提要并尝试访问节点,如下所示:
$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>';
。适当输出"[条目]"25 次。所以也许这是SimpleXML中的一个错误?这是更广泛的提要缓存系统的一部分,我对其他非 YT 提要没有任何问题,只有 YT 提要。
[更新]
这个问题表明如果你这样做它有效
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 调用按原样工作正常。