rss (really simple syndication) был разработан фирмой netscape и представляет собой расширение xml созданное специально для оформления новостных лент.
На сегодняшний день формат пережил уже 2-ю редакцию и является общепринятым стандартом для разметки новостей.

Вот пример простого rss документа:

< ?xml version="1.0" encoding="windows-1251"?>
< !doctype rss public "-//netscape communications//dtd rss 0.91//en"
"http://my.netscape.com/publish/formats/rss-0.91.dtd
< rss version="0.91">
< channel>
< title>none< /title>
< description>заполнение пустоты< /description>
< link>http://riscom.com/~none< /link>
< /channel>

< image>
< title>none< /title>
< url>http://riscom.com/~none/favicon.gif< /url>
< link>http://riscom.com/~none< /link>
< width>16< /width>
< height>16< /height>
< /image>

< item>
< title>rss - вкусные новости < /title>
< link>http://riscom.com/~none/< /link>
< description>Что такое rss и с чем его едят< /description>
< /item>

< /rss>

Структура достаточно наглядна и понятна.

Два общих блока (channel и image), применяемых к целому документу и блок(и) item, содержащий сами новости.

Блок channel определяет источник новостей:

title - имя сайта;
description - описание;
link - адрес
Блок image - графическое отображение сайта:

title - название;
link - адрес картинки;
width, height - ширина и высота.
Блоков item может быть сколько угодно и в них описываются сами новости:

title - заголовок;
link - адрес самой новости;
description - описание.
Всё, что находится выше тэга rss называется заголовком документа и применяется к любому xml документу, конечно же с соответствующими корректировками.

Теперь, после того, как мы научились создавать rss документ, давайте подумаем, что нам со всем этим добром делать.

Первая, и самая лёгкая идея, это, конечно же, ничего с ним не делать, просто создать процедурину автоматической генерации rss из любой публикуемой новости и забыть о нём. Дескать, пускай те, кому это нужно, сами парсят его.
Но, предположим, что у нас есть некоторый ресурс, на котором мы хотим публиковать новости всем известного сайта www.ionpopescu.md, а господин popescu ни в какую не хочет предоставлять их (новости), в каком либо другом формате кроме как в rss.
Что нам остаётся?
Правильно! Будем парсить.
Здесь, опять же, есть два выхода: первый - воспользоваться всеми известными парсерами xml типа sablotron и не морочить себе голову, второй - морочить.
У второго варианта есть и ещё одно оправдание, представьте что вы пользуетесь каким-нибудь бесплатным хостингом, и хостер ну ни в какую не хочет устанавливать у себя sablotron или его аналоги.

----------------------------------------------------
И сам скрипт:

< ?php 

function startelement($parser, $name, $attrs) {
global $tag, $rss;
if ($name == 'rss')
$rss = '^rss';
elseif ($name == 'rdf:rdf')
$rss = '^rdf:rdf'; 

$tag .= '^' . $name;
} 

function endelement($parser, $name) {
global $tag;
global $itemcount, $items;
if ($name == 'item') {
$itemcount++;
if (!isset($items[$itemcount])) $items[$itemcount] = array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => '');
} 

$tag = substr($tag, 0, strrpos($tag, '^'));
} 

function characterdata($parser, $data) {
global $tag, $chantitle, $chanlink, $chandesc, $rss, $imgtitle, $imglink, $imgurl;
global $items, $itemcount; 

$rsschannel = '';
if ($data) {
if ($tag == $rss . '^channel^title') {
$chantitle .= $data;
} elseif ($tag == $rss . '^channel^link') {
$chanlink .= $data;
} elseif ($tag == $rss . '^channel^description') {
$chandesc .= $data;
}
if ($rss == '^rss') $rsschannel = '^channel'; 

if ($tag == $rss . $rsschannel . '^item^title') {
$items[$itemcount]['title'] .= $data;
} elseif ($tag == $rss . $rsschannel . '^item^link') {
$items[$itemcount]['link'] .= $data;
} elseif ($tag == $rss . $rsschannel . '^item^description') {
$items[$itemcount]['desc'] .= $data;
} elseif ($tag == $rss . $rsschannel . '^item^pubdate') {
$items[$itemcount]['pubdate'] .= $data;
} elseif ($tag == $rss . $rsschannel . '^image^title') {
$imgtitle .= $data;
} elseif ($tag == $rss . $rsschannel . '^image^link') {
$imglink .= $data;
} elseif ($tag == $rss . $rsschannel . '^image^url') {
$imgurl .= $data;
}
} 

} 

function parserss($url) {
global $tag, $chantitle, $chanlink, $chandesc, $rss, $items, $itemcount, $imgtitle, $imglink, $imgurl;
$chantitle = '';
$chanlink = '';
$chandesc = '';
$imgtitle = '';
$imglink = '';
$imgurl = '';
$tag = '';
$rss = ''; 

global $items, $itemcount; 

$itemcount = 0;
$items = array(0 => array('title' => '', 'link' => '', 'desc' => '', 'pubdate' => '')); 

$xml_parser = xml_parser_create();
xml_set_element_handler($xml_parser, "startelement", "endelement");
xml_set_character_data_handler($xml_parser, "characterdata"); 

@$fp = fopen($url, "r");
$data = "";
while (true) {
@$datas = fread($fp, 4096);
if (strlen($datas) == 0) {
break;
}
$data .= $datas;
} 

@fclose($fp); 

if ($data != '') {
$xmlresult = xml_parse($xml_parser, $data);
$xmlerror = xml_error_string(xml_get_error_code($xml_parser));
$xmlcrtline = xml_get_current_line_number($xml_parser); 

if ($xmlresult)
displaydata();
else
print("error parsing this feed !< br />error: $xmlerror , at line: $xmlcrtline");
} else {
print("error while retriving feed $url");
} 

xml_parser_free($xml_parser);
} 

function displaydata() {
global $chantitle, $chanlink, $chandesc, $rss, $items, $itemcount, $imgtitle, $imglink, $imgurl;
global $items, $itemcount;
?>
< html>< head>< title>< ?= $chantitle ?>< /title>< /head>
< body>
< div>
< a href="< ?= $chanlink ?>">< img src="< ?= $imgurl ?>" alt="< ?= $imgtitle ?>" border="0" />< /a>
< h1>< ?= $chantitle ?>< /h1>
< h3>< ?= $chandesc ?>< /h3>
< /div>
< hr />
< ?php
for($i = 0;$i <  count($items)-1;$i++) {
echo "< h4>".$items[$i]['title']."< /h4>";
echo "< h5>".$items[$i]['pubdate']."< /h5>";
echo "< a href='".$items[$i]['link']."'>".$items[$i]['desc']."< /a>";
}
?>
< /body>< /html> 

< ?php } 

$url="http://xmlhack.ru/index.rdf";
parserss($url);
?>



Постоянные ссылки

При копировании ссылка на TeaM RSN обязательна!

URI

Html (ЖЖ)

BB-код (Для форумов)

Оставить комментарий

Вы должны войти, чтобы оставить комментарий.