Вопрос
У меня есть старый веб-сайт, который генерирует свой собственный 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 мы используем Устройство для создания корма.Используйте это, и ваша проблема исчезнет.:)
Вот 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://link.to/feeds/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);
};
Настоящий ПОЦЕЛУЙ.:)
Другие советы
Я бы использовал SimpleXML создать необходимую структуру и экспортировать XML-файл.Затем я бы кэшировал его на диск с помощью file_put_contents().
Я использовал этот класс feedcreator, лицензированный LGPL в прошлом, и это работало довольно хорошо для очень простого использования, которое у меня было для этого.
Не полный ответ, но вы не нужно разбирать ваш собственный XML-файл.Это повредит производительности и надежности.
Но обязательно убедитесь, что это так хорошо сформированный.Это не должно быть очень сложно, если вы создадите его вручную или с помощью инструментов общего назначения.Или, может быть, ваш включенный HTML все испортит?
Есть много вещей, которые могут привести к искажению XML.Это может быть проблема с символьными объектами (a '<', '>' или '&' в данных между XML-тегами).Попробуйте запустить любой вывод из базы данных через htmlentities() при объединении строки.У вас есть пример сгенерированного XML-файла, на который мы могли бы взглянуть, чтобы понять, в чем проблема?
PHP5 теперь поставляется с SimpleXML
расширение, это довольно быстрый способ создания корректного XML-файла, если ваши потребности не сложны.
Однако проблема, которую вы предлагаете, похоже, связана не с реализацией, а скорее с проблемой синтаксиса.Возможно, вы могли бы дополнить свой вопрос примером кода или копией созданного XML-файла.