читать cdata из RSS-ленты - PullRequest
       8

читать cdata из RSS-ленты

1 голос
/ 05 ноября 2011

Я читаю RSS-канал, используя простой код:

 <?php
$homepage = file_get_contents('http://www.forbes.com/news/index.xml');
$movies = new SimpleXMLElement($homepage);
echo '<pre>';
print_r($movies);
?>

и вывод такой: SimpleXMLElement Object ( [@attributes] => Массив ( [версия] => 2.0 )

[channel] => SimpleXMLElement Object
    (
        [title] => SimpleXMLElement Object
            (
            )

        [link] => SimpleXMLElement Object
            (
            )

        [description] => SimpleXMLElement Object
            (
            )

        [language] => en-us
        [copyright] => Copyright 2009 Forbes.com LLC
        [item] => Array
            (
                [0] => SimpleXMLElement Object
                    (
                        [title] => SimpleXMLElement Object
                            (
                            )

                        [link] => SimpleXMLElement Object
                            (
                            )

                        [author] => SimpleXMLElement Object
                            (
                            )

                        [pubDate] => Sat, 05 Nov 2011 07:17:21 GMT
                        [description] => SimpleXMLElement Object
                            (
                            )

                    )

и более .... но когда я просматриваю источник этой страницы, у меня появляется информация, подобная этой:

 <rss version="2.0"><channel><title><![CDATA[Forbes.com: News]]></title><link><!   [CDATA[http://www.forbes.com]]></link><description><![CDATA[News and reports from Forbes.com]]></description><language>en-us</language><copyright>Copyright 2009 Forbes.com LLC</copyright><item><title><![CDATA[Benicio Del Toro Offered Villain Role In "Star Trek" Sequel - Is It Khan?]]></title><link><![CDATA[http://www.forbes.com/sites/markhughes/2011/11/05/benicio-del-toro-offered-villain-role-in-star-trek-sequel-is-it-khan/?feed=rss_home]]></link><author><![CDATA[Mark Hughes]]></author><pubDate>Sat, 05 Nov 2011 07:17:21 GMT</pubDate><description><![CDATA[Variety reports that actor Benicio del Toro is being offered the role of villain in the upcoming sequel to director J.J. Abram?s 2009 blockbuster franchise-reboot movie Star Trek. So far, Abrams and crew have kept a tight lid on details about the new Paramount film, and the identity of the main villain is a closely ...]]></description>

как я могу прочитать и сохранить значение CDATA в моей базе данных.

Ответы [ 2 ]

10 голосов
/ 05 ноября 2011

Скажите SimpleXML, чтобы преобразовать CDATA в обычные тексты:

$homepage = 'http://www.forbes.com/news/index.xml';
$movies = simplexml_load_file($homepage, "SimpleXMLElement", LIBXML_NOCDATA);

Это должно сделать это для вас, используя simplexml_load_file вместо file_get_contents.

Связанный ответ: Удаление cdata в simplehtmldom .

3 голосов
/ 19 июля 2012

Вышеупомянутое «исправление» будет работать, но совершенно не нужно.

Объекты SimpleXML содержат много «волшебства» и не предназначены для просмотра с использованием print_r; CDATA находится в безопасности в вашем объекте, но не появится, если вы не попросите его правильно.

Если вы запустите echo (string)$movies->channel->title;, вы должны получить «Forbes.com: Новости», как и следовало ожидать.

Обратите внимание на (string), который говорит PHP явно преобразовывать «волшебный» SimpleXMLElement в строку. Если вы этого не сделаете, вы на самом деле получите еще один объект SimpleXMLElement - иначе мой пример не сработает, потому что $ movies-> channel будет строкой.

Рекомендуется всегда использовать (строку) при доступе к элементам или атрибутам из SimpleXML , так как некоторые функции будут задыхаться, если они ожидают строку, и вместо этого вы даете им объект SimpleXML, а также сериализацию или сеанс хранение, конечно, не удастся.

...