Очень преувеличен этот. В 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 работает нормально, как есть.