Я пытаюсь оптимизировать небольшое приложение php, которое я написал для разбора профилей YouTube. Введите имя пользователя YouTube, и приложение вернет простой список количества загруженных видео, избранных, подписчиков и т. Д. Путем анализа XML, возвращаемого запросом gdata для профиля учетной записи. Например, этот XML:PHP и XML находят узел на основе атрибута для поиска другого атрибута или индекса узла
<?xml version="1.0" encoding="UTF-8" ?>
<entry xmlns="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" xmlns:gd="http://schemas.google.com/g/2005" xmlns:yt="http://gdata.youtube.com/schemas/2007" gd:etag="W/"C0EHSX47eCp7I2A9Wh5aEU4."">
<id>tag:youtube.com,2008:user:H5m_qmnr3dHOO8x7m7dtvw</id>
<published>2006-06-15T22:59:11.000Z</published>
<updated>2014-01-07T21:53:58.000Z</updated>
<category scheme="http://schemas.google.com/g/2005#kind" term="http://gdata.youtube.com/schemas/2007#userProfile" />
<category scheme="http://gdata.youtube.com/schemas/2007/channeltypes.cat" term="DIRECTOR" />
<title>epontius</title>
<summary>channel page of epontius</summary>
<link rel="alternate" type="text/html" href="https://www.youtube.com/channel/UCH5m_qmnr3dHOO8x7m7dtvw" />
<link rel="self" type="application/atom+xml" href="https://gdata.youtube.com/feeds/api/users/H5m_qmnr3dHOO8x7m7dtvw?v=2" />
<author>
<name>epontius</name>
<uri>https://gdata.youtube.com/feeds/api/users/epontius</uri>
<yt:userId>H5m_qmnr3dHOO8x7m7dtvw</yt:userId>
</author>
<yt:channelId>UCH5m_qmnr3dHOO8x7m7dtvw</yt:channelId>
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.subscriptions" href="https://gdata.youtube.com/feeds/api/users/epontius/subscriptions?v=2" countHint="161" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.liveevent" href="https://gdata.youtube.com/feeds/api/users/epontius/live/events?v=2" countHint="0" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.favorites" href="https://gdata.youtube.com/feeds/api/users/epontius/favorites?v=2" countHint="73" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.contacts" href="https://gdata.youtube.com/feeds/api/users/epontius/contacts?v=2" countHint="184" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.inbox" href="https://gdata.youtube.com/feeds/api/users/epontius/inbox?v=2" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.playlists" href="https://gdata.youtube.com/feeds/api/users/epontius/playlists?v=2" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.uploads" href="https://gdata.youtube.com/feeds/api/users/epontius/uploads?v=2" countHint="26" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.newsubscriptionvideos" href="https://gdata.youtube.com/feeds/api/users/epontius/newsubscriptionvideos?v=2" />
<gd:feedLink rel="http://gdata.youtube.com/schemas/2007#user.recentactivity" href="https://gdata.youtube.com/feeds/api/users/epontius/events?v=2" />
<yt:googlePlusUserId>105085469892080308187</yt:googlePlusUserId>
<yt:location>US</yt:location>
<yt:statistics lastWebAccess="1970-01-01T00:00:00.000Z" subscriberCount="245" videoWatchCount="0" viewCount="0" totalUploadViews="68815" />
<media:thumbnail url="https://yt3.ggpht.com/-N_Et9Qg1APc/AAAAAAAAAAI/AAAAAAAAAAA/VIuQ_GuzA0Q/s88-c-k-no/photo.jpg" />
<yt:userId>H5m_qmnr3dHOO8x7m7dtvw</yt:userId>
<yt:username display="epontius">epontius</yt:username>
</entry>
приложение, как он стоит отлично работает, но каждый так часто YouTube меняет порядок некоторых элементов или добавляет/удаляет элементы в строках, так что приложение возвращает неверные данные, как я доступ к атрибуту countHint. Например:
$uploadscount = $gd->feedLink[6]->attributes();
$uploads = $uploadscount['countHint'];
echo 'Number of uploads: ' . '<span class="datatext">' . $uploads . '</span>' . '<br />';
Что бы вернуть 26 в этом случае. Но если число или порядок строк feedLink меняются, я получаю неправильную информацию или ошибку, так как индексный номер feedLink жестко закодирован. Кажется, что у каждого feedLink есть уникальный атрибут rel =, и я надеялся использовать xpath и какой-то цикл, как foreach, для поиска определенного значения rel (то есть rel = "http://gdata.youtube.com/schemas/2007#user.uploads"), а затем иметь возможность захватите его значение атрибута countHint, чтобы присвоить его переменной или, по крайней мере, захватить ее номер индекса узла (т. е. 6 в случае загрузок), чтобы затем получить доступ к соответствующему атрибуту countHint. Затем повторите это для каждой из строк и атрибутов feedLink для данных, которые я хочу захватить. Таким образом, он будет более точным и динамичным, если эти линии feedLink будут изменены. Я просто не могу понять, как это сделать. Элементы feedLink - это пустые элементы в другом пространстве имен (gd), и есть множественные числа, которые делают использование xpath путающим для меня. Я продолжаю возвращать пустые значения и теряться. Любые предложения будут оценены.
Хорошо. Подумайте, я получаю кое-что благодаря предложениям.
foreach ($gd->feedLink as $feedLink) {
$attributes = $feedLink->attributes();
if (strpos($attributes['rel'], '#user.uploads')) {
$uploads = $attributes['countHint'];
}
elseif (strpos($attributes['rel'], '#user.favorites')) {
$favs = $attributes['countHint'];
}
elseif (strpos($attributes['rel'], '#user.subscriptions')) {
$subscriptions = $attributes['countHint'];
}
elseif (strpos($attributes['rel'], '#user.liveevent')) {
$liveevents = $attributes['countHint'];
}
elseif (strpos($attributes['rel'], '#user.contacts')) {
$friends = $attributes['countHint'];
}
}
Это будет возвращать правильные значения я ищу, но теперь я боюсь, что я делаю дополнительную обработку делают петлю, так как я предполагаю, каждый из проверки конца цикла каждой строки, независимо от того, имеет ли он уже нашли это значение в предыдущем цикле?
Я думаю, что это помогает, и я получаю где-то. Мне пришлось немного модифицировать его с '$ uploadscount = $ attributes;' показывал URL-адрес, а не значение, и продолжающиеся перерывы не работали с несколькими значениями. – epontius