PHP - построитель RSS

У меня есть старый веб-сайт, который генерирует собственный 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?

Пример вашей ленты очень поможет.

ceejayoz 17.09.2008 17:02

Готово, я поместил фрагмент своего кода

Patrick Desjardins 17.09.2008 17:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
2
2
2 066
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

Я бы использовал simpleXML для создания необходимой структуры и экспорта XML. Затем я бы кэшировал его на диск с помощью file_put_contents ().

Я использовал этот класс создателей кормов под лицензией LGPL в прошлом, и он работал достаточно хорошо для очень простого использования, которое у меня было.

Я тоже этим пользуюсь. Расширяемый, простой в использовании и готовый к использованию RSS.

cori 17.09.2008 17:13

PHP5 теперь поставляется с расширением SimpleXML, это довольно быстрый способ создания корректного XML, если ваши потребности не являются сложными.

Однако проблема, которую вы предлагаете, похоже, не связана с реализацией, а скорее с проблемой синтаксиса. Возможно, вы могли бы обновить свой вопрос примером кода или копией созданного XML.

Не полный ответ, но вы не нужно разбирать свой собственный XML. Это повредит производительности и надежности.

Но обязательно убедитесь, что это правильно сформированный. Это не должно быть очень сложно, если вы создадите его вручную или с помощью универсальных инструментов. Или, может быть, ваш включенный HTML портит его?

Я добавляю HTML внутри тега <[Data. плохая идея? И как мне не разбирать XML, если я хочу добавить его, не стирая старый пост?

Patrick Desjardins 17.09.2008 19:21

Ладно, это не должно нарушать стройности. Ах, вы разбираете XML, чтобы изменить его ... почему бы тогда не сгенерировать все с нуля? Если это RSS-канал, у вас не должно быть более 10 сообщений. Даже если у вас 100, это не должно быть проблемой.

Paweł Hajdan 17.09.2008 23:34

Есть много вещей, которые могут сделать XML искаженным. Это может быть проблема с символьными сущностями ('<', '>' или '&' в данных между тегами XML). Попробуйте запустить любой вывод из базы данных через htmlentities (), когда вы объединяете строку. У вас есть пример сгенерированного XML, чтобы мы могли посмотреть, в чем проблема?

Я добавил для вас пример в исходный пост.

Patrick Desjardins 17.09.2008 19:20
Ответ принят как подходящий

На 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 = '[email protected]';
    $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);
};

Довольно ПОЦЕЛУЙ. :)

Выглядит довольно интересно, я проверю это решение, как только смогу закончить работу!

Patrick Desjardins 17.09.2008 21:06

Другие вопросы по теме