Can#39;t access XML node via xpath() (YT channel feed)(可以通过XPath()(YT频道提要)访问XML节点)
本文介绍了可以通过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节点的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:可以通过XPath()(YT频道提要)访问XML节点


猜你喜欢
- Laravel 5:Model.php 中的 MassAssignmentException 2021-01-01
- PHP foreach() 与数组中的数组? 2022-01-01
- Oracle 即时客户端 DYLD_LIBRARY_PATH 错误 2022-01-01
- 如何使用 Google API 在团队云端硬盘中创建文件夹? 2022-01-01
- openssl_digest vs hash vs hash_hmac?盐与盐的区别HMAC? 2022-01-01
- PHP - if 语句中的倒序 2021-01-01
- 覆盖 Magento 社区模块控制器的问题 2022-01-01
- 如何从数据库中获取数据以在 laravel 中查看页面? 2022-01-01
- 如何在 Symfony2 中正确使用 webSockets 2021-01-01
- 使用 GD 和 libjpeg 支持编译 PHP 2022-01-01