Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: rss парсер
 
 автор: kostya1082   (28.05.2006 в 13:22)   письмо автору
 
 

как лучше сделать парсер rss
через регулярные выражения или какими нибудь классом?

   
 
 автор: cheops   (28.05.2006 в 14:37)   письмо автору
 
   для: kostya1082   (28.05.2006 в 13:22)
 

Это зависит от объёма RSS-файла и от предпочтений разработчика - если вам проще сделать это при помощи регулярных выражений, можно воспользоваться ими, если нет - то одним из расширений для работы с XML-файлами.

   
 
 автор: Александр Кондраков   (29.05.2006 в 10:13)   письмо автору
 
   для: kostya1082   (28.05.2006 в 13:22)
 

Можно попробовать использовать XSLT. Создай XSL файл и преобразуй rss в любой удобный для тебя формат - html, текстовый или любой другой.
Я в одном проекте (отправка rss на email) делал так:
Создал xsl файл для преобразований. Мне надо было преобразовать в текстовый формат:


<?xml version="1.0" encoding="windows-1251"?>
<xsl:stylesheet version="1.0"
    xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:output method="text" encoding="windows-1251" />
<xsl:template match="rss">
***********************************************************
Описание Сайта:
Название: <xsl:value-of select="channel/title/text()" />
Описание: <xsl:value-of select="channel/description/text()" />
Ссылка: <xsl:value-of select="channel/link/text()" />
***********************************************************
Сообшения:

<xsl:for-each select="channel/item">            
Название: <xsl:value-of select="title/text()" />
Описание СМИ: <xsl:value-of select="enclosure/text()" />
Ссылка: <xsl:value-of select="link/text()" />
Описание: <xsl:value-of select="description/text()" />
Email Автора: <xsl:value-of select="author/text()" />
Источник: <xsl:value-of select="source/text()" />
Время публикации: <xsl:value-of select="pubDate/text()" />
    
***********************************************************
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>


Потом с помощью php я сделал следующий класс примерно так...:

class Rss2Mail
{
    /* Приватные поля, необходимые для работы.
    $RssUrl - адрес канала
    $Xsl - ссылка на файл xsl
    $Email - адрес почты, на которую будут приходить сообщения
    $Content - тело сообщения, полученного в результате xslt трансформации
    $Error - сообщение об ошибках.
    */
    private $RssUrl, $Xsl, $Email, $Content, $Error;
    
    /* Конструктор класса. Экземпляры должны создаваться примерно так:
       new Rss2Mail("www.somewhere.ru/rss.xml", "www.mysite.ru/rss2txt.xsl", "me@mymail.ru")
    */
    public function __construct($rssUrl, $xsl, $email)
    {
        $this->RssUrl = $rssUrl;
        $this->Email = $email;
        $this->Xsl = $xsl;
        $this->Content = $this->RssToXslt();
        $this->Mailing();
    }
    
    // Метод, позволяющий обратиться к сообщению об ошибке извне
    public function GetError()
    {
        return $this->Error;
    }
    
    /* Метод, читающий RSS канал и преобразующий его в текстовый формат.
       Возвращает поле Content.
    */
    private function RssToXslt()
    {
        // Открываем RSS
        $document = new domDocument();
        if(!@$document->load($this->RssUrl))
        {
            $this->Error = "Не удается загрузить RSS канал";
            return false;
        }
        // Открываем XSL
        $xslt_1=new domDocument();
        //rss2txt.xsl
        if(!@$xslt_1->load($this->Xsl))
        {
            $this->Error = "Не удается загрузить XSL файл";
            return false;
        }
        
        // Делаем преобразование
        $xslt=new xsltProcessor();
        $xslt->importStylesheet($xslt_1);
        $this->Content = $xslt->transformtoXML($document);
        if(!$this->Content)
        {
            $this->Error = "Не удается сделать преобразование Rss в TEXT";
            return false;
        }
        return $this->Content;
    }
    
    // Метод отправляет сообщение по указанному адресу
    private function Mailing()
    {
        if(empty($this->Content) || $this->Content == " ")
        {
            $this->Error = "Сообщение содержит пустую строку. Отправка почты невозможна!";
            return false;
        }
        else
        {
            if(!mail($this->Email, "Rss2Email", $this->Content))
            {
                $this->Error = "Не могу отправить электронную почту!";
                return false;
            }
        }
    }
}



Потом создал экземпляр этого класса примерно так:

$rss2mail = new Rss2Mail($Rss, $Xsl, $Email);
echo $rss2mail->GetError();


Как я уже говорил, можно сделать преобразования в любой формат. Главное, чтобы исходный rss файл был не очень большого размера. Xslt на мой взгляд медленновато преобразует большие файлы.

   
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования