本文介绍了可以通过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调用按原样运行良好。

这篇关于可以通过XPath()(YT频道提要)访问XML节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

11-02 07:45