У меня есть старый веб-сайт, который генерирует собственный RSS каждый раз, когда создается новое сообщение. Все работало, когда я был на сервере с PHP 4, но теперь, когда хост изменился на PHP 5, у меня всегда есть «плохо сформированный XML». Я использовал xml_parser_create () и xml_parse (…) и fwrite (..), чтобы сохранить все.
Вот пример при сохранении (я прочитал, прежде чем сохранить, чтобы, конечно, добавить старую строку RSS).
function SaveXml() { if (!is_file($this->getFileName())) { //Création du fichier $file_handler = fopen($this->getFileName(),"w"); fwrite($file_handler,""); fclose($file_handler); }//Fin du if //Header xml version="1.0" encoding="utf-8" $strFileData = '<?xml version="1.0" encoding="iso-8859-1" ?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/"><channel><title>'.$this->getProjectName().'</title><link>http://www.mywebsite.com</link><description>My description</description><lastBuildDate>' . date("r"). '</lastBuildDate>'; //Data reset($this->arrData); foreach($this->arrData as $i => $value) { $strFileData .= '<item>'; $strFileData .= '<title>'. $this->GetNews($i,0) . '</title>'; $strFileData .= '<pubDate>'. $this->GetNews($i,1) . '</pubDate>'; $strFileData .= '<dc:creator>'. $this->GetNews($i,2) . '</dc:creator>'; $strFileData .= '<description><![CDATA['. $this->GetNews($i,3) . ']]> </description>'; $strFileData .= '<link><![CDATA['. $this->GetNews($i,4) . ']]></link>'; $strFileData .= '<guid>'. $this->GetNews($i,4) . '</guid>'; //$strFileData .= '<category>'. $this->GetNews($i,5) . '</category>'; $strFileData .= '<category>Mycategory</category>'; $strFileData .= '</item>'; }//Fin du for i $strFileData .= '</channel></rss>'; if (file_exists($this->getFileName()))//Détruit le fichier unlink($this->getFileName()); $file_handler = fopen($this->getFileName(),"w"); fwrite($file_handler,$strFileData); fclose($file_handler); }//Fin de SaveXml
Мой вопрос: как вы создаете и заполняете свои RSS в PHP?
На swcombine.com мы используем Feedcreator . Используйте это, и ваша проблема исчезнет. 🙂
Вот PHP-код для его использования после установки:
function feed_simnews() { $objRSS = new UniversalFeedCreator(); $objRSS->title = 'My News'; $objRSS->link = 'http://link.to/news.php'; $objRSS->description = 'daily news from me'; $objRSS->xsl = 'http://link.to/feeds/feedxsl.xsl'; $objRSS->language = 'en'; $objRSS->copyright = 'Copyright: Mine!'; $objRSS->webmaster = 'webmaster@somewhere.com'; $objRSS->syndicationURL = 'http://link.to/news/simnews.php'; $objRSS->ttl = 180; $objImage = new FeedImage(); $objImage->title = 'my logo'; $objImage->url = 'http://img.ruphp.com/php/logo.jpg'; $objImage->link = 'http://link.to'; $objImage->description = 'Feed provided by link.to. Click to visit.'; $objImage->width = 120; $objImage->height = 60; $objRSS->image = $objImage; //Function retrieving an array of your news from date start to last week $colNews = getYourNews(array('start_date' => 'Last week')); foreach($colNews as $p) { $objItem = new FeedItem(); $objItem->title = $p->title; $objItem->description = $p->body; $objItem->link = $p->link; $objItem->date = $p->date; $objItem->author = $p->author; $objItem->guid = $p->guid; $objRSS->addItem($objItem); } $objRSS->saveFeed('RSS2.0', 'http://link.to/feeds/news.xml', false); };
Довольно KISS. 🙂
Я бы использовал simpleXML для создания требуемой структуры и экспорта XML. Затем я буду кэшировать его на диск с помощью file_put_contents ().
В прошлом я использовал этот класс, основанный на лицензии LGPL, и он работал достаточно хорошо для самого простого использования, которое у меня было для него.
Не полный ответ, но вам не нужно разбирать свой собственный XML. Это повредит производительности и надежности.
Но обязательно убедитесь, что он хорошо сформирован . Это не должно быть очень сложно, если вы создадите его вручную или используя инструменты общего назначения. Или, может быть, ваш включенный HTML-код разрушает его?
Есть много вещей, которые могут привести к искажению XML. Это может быть проблемой с символьными сущностями (a '<', '>' или '&' в данных между тегами XML). Попробуйте запустить любой вывод из базы данных через htmlentities (), когда вы объединяете строку. У вас есть пример сгенерированного XML, чтобы мы могли посмотреть, чтобы мы могли видеть, где проблема?
PHP5 теперь поставляется с расширением SimpleXML
, это довольно быстрый способ создания правильного XML, если ваши потребности не сложны.
Тем не менее, проблема, которую вы предлагаете, по-видимому, не представляет проблемы с реализацией проблемы синтаксиса. Возможно, вы могли бы обновить свой вопрос с помощью примера кода или копии созданного XML.