gpt4 book ai didi

php - 无法通过xpath()(YT channel 供稿)访问XML节点

转载 作者:行者123 更新时间:2023-12-03 05:32:42 25 4
gpt4 key购买 nike

对此很困扰。在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次“[entry]”。那么也许这是SimpleXML中的错误?这是更广泛的提要缓存系统的一部分,对于其他非YouTube提要,只有YouTube提要,我没有遇到任何麻烦。

[更新]

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

最佳答案

发生这种情况是因为feed是具有定义的默认 namespace 的Atom文档。

<feed xmlns="http://www.w3.org/2005/Atom" ...

由于定义了 namespace ,因此您也必须为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尊重所有定义的 namespace ,您需要相应地处理它们,包括默认 namespace 。您会注意到,列出的第二个提要没有定义默认的 namespace ,因此xpath调用可以正常工作。

关于php - 无法通过xpath()(YT channel 供稿)访问XML节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22880348/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com