Я внедряю push-уведомления Youtube и внедрил webhook. Youtube дает обновления в виде атомной ленты. Моя проблема в том, что я не могу разобрать этот канал.
Это XML:
<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xmlns:yt="http://www.youtube.com/xml/schemas/2015">
<link rel="hub" href="https://pubsubhubbub.appspot.com" />
<link rel="self" href="https://www.youtube.com/xml/feeds/videos.xml?channel_id=UCaNoTnXcQQt3ody_cLZSihw" />
<title>YouTube video feed</title>
<updated>2018-03-01T07:21:59.144766801+00:00</updated>
<entry>
<id>yt:video:vNQyYJqFopE</id>
<yt:videoId>vNQyYJqFopE</yt:videoId>
<yt:channelId>UCaNoTnXcQQt3ody_cLZSihw</yt:channelId>
<title>Test Video 4</title>
<link rel="alternate" href="https://www.youtube.com/watch?v=vNQyYJqFopE" />
<author>
<name>Testing</name>
<uri>https://www.youtube.com/channel/UCaNoTnXcQQt3ody_cLZSihw</uri>
</author>
<published>2018-03-01T07:21:48+00:00</published>
<updated>2018-03-01T07:21:59.144766801+00:00</updated>
</entry>
<?php
$xml = '<?xml versio......';
$obj = simplexml_load_string($xml);
echo '<pre>';print_r($obj);echo '</pre>';
Как получить значение элемента yt: videoId. Я новичок в PHP, если я сделал что-то не так, пожалуйста, поправьте меня.
Кажется, что элементы XML, содержащие пространство имен yt (например, <yt:videoId>
) не анализируются simplexml_load_string
, Я не знаю почему, но в вашем случае идентификатор видео также присутствует в <id>
элемент вам просто нужно извлечь последнее значение или просто вырезать из yt:video:
перед ней. Это по крайней мере легкий обходной путь.
Также это работает, если вы используете прямой XPath к <yt:videoId>
элемент как это:
echo $obj->xpath('//yt:videoId')[0];
// output: vNQyYJqFopE
XPath всегда возвращает массив, поэтому вам нужно получить первый элемент с [0]
,
Попробуйте это (обновлено)
$str = $obj->entry->id;
echo substr($str, strpos($str, "video:")+ 6);
Получить канал
$chan = $obj->entry->author->uri;
echo substr($chan , strpos($chan , "channel/")+ 8);