Я читаю 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] => Array ([версия] => 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 JJ 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 в mydatabase.
Скажите 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 .
Вышеупомянутое «исправление» будет работать, но совершенно не нужно.
Объекты SimpleXML содержат много «магии» и не предназначены для просмотра с помощью print_r
; CDATA безопасно находится в вашем объекте, но не появится, если вы не попросите его правильно.
Если вы запустите echo (string)$movies->channel->title;
вы должны получить «Forbes.com: Новости», как и следовало ожидать.
Обратите внимание на (string)
, которая сообщает PHP явно преобразовать «магический» SimpleXMLElement в строку. Если вы этого не сделаете, вы действительно получите другой объект SimpleXMLElement, иначе мой пример не будет работать, потому что канал $ movies-> будет строкой.
Хорошая практика всегда использовать (строку) при доступе к элементам или атрибутам из SimpleXML , так как некоторые функции задушат , если они ожидают строку, и вместо этого вы даете им объект SimpleXML, и сериализация или хранение сеанса, безусловно, потерпят неудачу.