Не удается получить доступ к узлу XML через xpath () (канал канала YT)

Очень преувеличен этот. В PHP я извлекаю фид VID для пользователей 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.

[ОБНОВИТЬ]

Этот вопрос показывает, что он работает, если вы это делаете

 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 работает нормально, как есть.