|
|
|
| как лучше сделать парсер rss
через регулярные выражения или какими нибудь классом? | |
|
|
|
|
|
|
|
для: kostya1082
(28.05.2006 в 13:22)
| | Это зависит от объёма RSS-файла и от предпочтений разработчика - если вам проще сделать это при помощи регулярных выражений, можно воспользоваться ими, если нет - то одним из расширений для работы с XML-файлами. | |
|
|
|
|
|
|
|
для: 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 на мой взгляд медленновато преобразует большие файлы. | |
|
|
|