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


Can't access XML node via xpath() (YT channel feed)

被这个难倒了。在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 调用按原样工作正常。