经由的xpath不能访问XML节点()(YT通道进料)(Can't access XML n

2019-10-19 18:11发布

这个一个非常难住了。 在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>';

有明目张胆 entry在XML节点。 这是通过运行证实:

foreach($xml->xpath('*') as $node) echo '<p>['.$node->getName().']</p>';

...其中妥输出“[条目]” 25次。 因此,也许这是SimpleXML中的错误吗? 这是一个更广泛的饲料缓存系统的一部分,我并没有与其他非YT饲料,只有那些YT任何麻烦。

[UPDATE]

这个问题表明,它的作品,如果你这样做

count($xml->entry)

但我很好奇,为什么count($xml->xpath('entry'))不也行...

[更新2]

我可以高兴地遍历YT的anternate饲料格式就好了:

http://gdata.youtube.com/feeds/base/users/{user id}/uploads?alt=rss&v=2

Answer 1:

这是发生由于原料与定义的默认命名空间的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调用工作正常原样。



文章来源: Can't access XML node via xpath() (YT channel feed)