Синтаксический анализ XML из канала YouTube (без Zend)

Мне нужно получить очень конкретные значения из фида, например этого:

http://gdata.youtube.com/feeds/api/videos/iIp7OnHXBlo

Вот некоторые из узлов, которые мне нужно прочитать из этого причудливого формата XML:

<title type="text">Uploading YouTube Videos with the PHP Client Library</title>

<media:content url="http://www.youtube.com/v/iIp7OnHXBlo?version=3&f=videos&app=youtube_gdata" type="application/x-shockwave-flash" medium="video" isDefault="true" expression="full" duration="466" yt:format="5"/>
<media:content url="rtsp://v3.cache7.c.youtube.com/CiILENy73wIaGQlaBtdxOnuKiBMYDSANFEgGUgZ2aWRlb3MM/0/0/0/video.3gp" type="video/3gpp" medium="video" expression="full" duration="466" yt:format="1"/>

<media:description type="plain">Jochen Hartmann demonstrates the basics of how to use the PHP Client Library with the YouTube Data API. [...]</media:description>

<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/0.jpg" height="360" width="480" time="00:03:53"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/1.jpg" height="90" width="120" time="00:01:56.500"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/2.jpg" height="90" width="120" time="00:03:53"/>
<media:thumbnail url="http://i.ytimg.com/vi/iIp7OnHXBlo/3.jpg" height="90" width="120" time="00:05:49.500"/>
<yt:duration seconds="466"/>

Конечно, об использовании Zend Framework API для GData не может быть и речи (1225 файлов и 49 МБ только для синтаксического анализа XML-файла? Да, конечно ... Мой Господин.

Мне нужно использовать парсер lastRSS или любые встроенные функции XML из PHP, как это сделал бы любой человек в здравом уме. Заранее благодарим за любые советы.


person andreszs    schedule 20.03.2013    source источник
comment
вам нужна эта серверная или клиентская сторона?   -  person Brad    schedule 20.03.2013
comment
Ну, есть SimpleXML, который уже поставляется с PHP и предлагает очень легкий доступ. У него даже есть xpath.   -  person hakre    schedule 20.03.2013
comment
А что причудливо отформатировано? Вам интересно, какие пространства имен XML используются в этом документе? Я всегда думал, что они очень распространены для каналов Atom, если используются такие носители, как изображения, аудио или видео.   -  person hakre    schedule 20.03.2013
comment
Возможное дублирование доступа к элементам в пространстве имен XML через SimpleXML (вопросы и ответы существуют по теме, должны быть даже с XML, специфичным для Youtube, например, Как можно я получаю атрибут xml для ‹yt: accesscontrol›? или Получить атрибут XML с помощью SimpleXML).   -  person hakre    schedule 04.09.2013


Ответы (2)


Другое решение - использовать этот отличный класс xml2Array: он в основном преобразует xml в ассоциативный массив, который очень прост в использовании.

Например, опубликованный вами XML-код YouTube выглядит следующим образом:

Array
(
    [ENTRY] => Array
    (
        [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
        [ID] => Array
            (

И т.п.

class xml2Array
{

    var $stack=array();
    var $stack_ref;
    var $arrOutput = array();
    var $resParser;
    var $strXmlData;

    function push_pos(&$pos)
    {
            $this->stack[count($this->stack)]=&$pos;
            $this->stack_ref=&$pos;
    }

    function pop_pos()
    {
            unset($this->stack[count($this->stack)-1]);
            $this->stack_ref=&$this->stack[count($this->stack)-1];
    }

    function parse($strInputXML)
    {
            $this->resParser = xml_parser_create ();
            xml_set_object($this->resParser,$this);
            xml_set_element_handler($this->resParser, "tagOpen", "tagClosed");

            xml_set_character_data_handler($this->resParser, "tagData");

            $this->push_pos($this->arrOutput);

            $this->strXmlData = xml_parse($this->resParser,$strInputXML );
            if(!$this->strXmlData)
            {
                    die(sprintf("XML error: %s at line %d",
                    xml_error_string(xml_get_error_code($this->resParser)),
                    xml_get_current_line_number($this->resParser)));
            }

            xml_parser_free($this->resParser);

            return $this->arrOutput;
    }

    function tagOpen($parser, $name, $attrs)
    {
            if (isset($this->stack_ref[$name]))
            {
                    if (!isset($this->stack_ref[$name][0]))
                    {
                            $tmp=$this->stack_ref[$name];
                            unset($this->stack_ref[$name]);
                            $this->stack_ref[$name][0]=$tmp;
                    }
                    $cnt=count($this->stack_ref[$name]);
                    $this->stack_ref[$name][$cnt]=array();
                    if (isset($attrs))
                            $this->stack_ref[$name][$cnt]=$attrs;
                    $this->push_pos($this->stack_ref[$name][$cnt]);
            }
            else
            {
                    $this->stack_ref[$name]=array();
                    if (isset($attrs))
                            $this->stack_ref[$name]=$attrs;
                    $this->push_pos($this->stack_ref[$name]);
            }
    }

    function tagData($parser, $tagData)
    {
            if(trim($tagData))
            {
                    if(isset($this->stack_ref['DATA']))
                            $this->stack_ref['DATA'] .= $tagData;
                    else
                            $this->stack_ref['DATA'] = $tagData;
            }
    }

    function tagClosed($parser, $name)
    {
            $this->pop_pos();
    }
}
person Grynn    schedule 20.03.2013
comment
БЛАГОДАРНОСТЬ!! Это идеально подходит для легкого анализа файла, отлично работает. :) - person andreszs; 20.03.2013

У меня была такая же проблема всего несколько недель назад. Добавив ?format=5&alt=json, вы можете получить ответ в формате JSON, который затем можно легко проанализировать в PHP.

$url = 'http://gdata.youtube.com/feeds/api/videos/iIp7OnHXBlo?format=5&alt=json';
$response = file_get_contents($url);

$obj = json_decode($response);
person xbonez    schedule 20.03.2013