2003-02-21 16:39:06 UTC

В последнее время, популярность формата RSS — Really Simple Syndication, начала подниматься. Подробнее о том, что это такое читайте у Дмитрия Смирнова, — ссылка есть в конце этой страницы. Пожалуй, внесу и я свою лепту в это дело, — приведу небольшой пример кода работы на парсере с внешним XML в формате RSS.

Этот пример будет основан на . Разумеется структура 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.

Понятно что метод вызывается с двумя параметрами:

  1. local_file – локальный XML с путём к нему вида /external_xml/rss2.xml
  2. remote_fileURL удалённого XML RSS
^rss[rss2.xml;http://www.server.ru/rss2.xml]

Полезно также, почитать . А здесь вроде всё, — тренируемся :)

Загрузить пример rss.zip

2003-02-21 16:39:06 UTC parser snippet web xml