2003-02-21 16:39:06 UTC
В последнее время, популярность формата RSS — Really Simple Syndication, начала подниматься. Подробнее о том, что это такое читайте у Дмитрия Смирнова, — ссылка есть в конце этой страницы. Пожалуй, внесу и я свою лепту в это дело, — приведу небольшой пример кода работы на парсере с внешним XML в формате RSS.
Этот пример будет основан на предыдущем примере работы с внешним XML . Разумеется структура RSS XML несколько другая, чем в этом примере. Я буду работать с версией RSS 2.0 – это конечно не особенно принципиально, потому что код легко адаптируется и для других версий (0.91, 1.0 и пр.). Результирующий HTML будет списком определений dl (definition list). Итак, к делу:
###### @rss[local_file;remote_file][src;xml;list;now;date;title;link;description] # проверяем локальный файл, - если его дата изменения более чем на # день старее текущего времени, грузим его с внешнего сервера $src[^file::stat[$local_file]] $now[^date::now[]] ^if($src.mdate < $now-1){ # пытаемся загрузить и проверить внешний XML файл и сохранить его # если не удается загрузка и/или проверка, обрабатываем исключение и ничего не делаем ^try{ # Загрузка внешнего файла $src[^file::load[text;$remote_file]] # проверка, - пытаемся создать объект класса xdoc из внешнего XML $xml[^xdoc::create{^untaint{$src.text}}] ^src.save[text;$local_file] }{ $exception.handled(1) } } # всегда создаем объект класса xdoc из XML файла на локальном диске # разумеется он должен всегда существовать. При удачной загрузке с # внешнего сервера, он ещё и постоянно обновляется $xml[^xdoc::load[$local_file]] # хэш элементов item из файла $list[^xml.select[/rss/channel/item]] # Название канала <h1>^xml.selectString[string(/rss/channel/title)]</h1> # Описание канала <p>^xml.selectString[string(/rss/channel/description)]</p> # Список материалов <dl> ^for[i](1;$list){ $date{^xml.selectString[string(/rss/channel/item[position() = $i]/pubDate)]} $title{^xml.selectString[string(/rss/channel/item[position() = $i]/title)]} $link{^xml.selectString[string(/rss/channel/item[position() = $i]/link)]} $description{^xml.selectString[string(/rss/channel/item[position() = $i]/description)]} <dt><a href="$link">$title</a> ($date)</dt> <dd>$description</dd> } </dl>
- Примечание:
- Проверка создания
xdoc
объекта из внешнего XML имеет цель просто проверить правильность оформления внешнего XML и она конечно не может выявить несоответствия этого XML словарю RSS, поскольку в текущей версии парсера, при работе с XML, отсутствует проверка валидности документов либо с помощью DTD либо с помощью XML Schema.
Понятно что метод вызывается с двумя параметрами:
-
local_file
– локальный XML с путём к нему вида/external_xml/rss2.xml
-
remote_file
– URL удалённого XML RSS
^rss[rss2.xml;http://www.server.ru/rss2.xml]
Полезно также, почитать предыдущий пример про работу с внешним XML . А здесь вроде всё, — тренируемся :)