Невозможно проанализировать подачу атома

Я внедряю 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, если я сделал что-то не так, пожалуйста, поправьте меня.

1

Решение

Кажется, что элементы XML, содержащие пространство имен yt (например, <yt:videoId>) не анализируются simplexml_load_string, Я не знаю почему, но в вашем случае идентификатор видео также присутствует в <id> элемент вам просто нужно извлечь последнее значение или просто вырезать из yt:video: перед ней. Это по крайней мере легкий обходной путь.

Также это работает, если вы используете прямой XPath к <yt:videoId> элемент как это:

echo $obj->xpath('//yt:videoId')[0];
// output: vNQyYJqFopE

XPath всегда возвращает массив, поэтому вам нужно получить первый элемент с [0],

1

Другие решения

Попробуйте это (обновлено)

$str = $obj->entry->id;
echo substr($str, strpos($str, "video:")+ 6);

Получить канал

$chan = $obj->entry->author->uri;
echo substr($chan , strpos($chan , "channel/")+ 8);
1