Živě.cz o počítačích a internetu

Tipy a triky v Delphi, díl 166. – RSS čtečka

Jan Šindelář 8.12.2004

Dnes nás čeká opět tvorba užitečné aplikace. Vytvoříme si základ pro jednoduchou RSS čtečku. Uvidíte, že to není žádná věda.

Vynecháme teoretické úvody o tom, co je to RSS (či "RSS kanál"), místo toho vás raději odkážu na informace například zde na Živě. Tento způsob informování čtenářů o nových příspěvcích na webových stránkách je zejména u zpravodajských serverů stále oblíbenější. Pro čtení těchto informací však potřebujeme zvláštní aplikaci, tzv. RSS čtečku, a to buď v podobě samostatného programu nebo případně jako rozšíření webového prohlížeče či emailového klienta. Základ takové čtečky si dnes vytvoříme.

Princip je vlastně velmi jednoduchý. Pokud už víte něco více o RSS, není pro vás tajemství, že je to vlastně jen "obyčejný" XML soubor s definovanou strukturou, který obsahuje seznam nových článků, jejich titulek a odkaz na příslušnou HTML stránku. Tento XML může být vytvořen buď ručně webmasterem stránek či generován automaticky skriptem z databáze, ale jeho formát je vždy stejný, resp. měl by odpovídat příslušnému standardu. Naše aplikace tedy musí rozumět jazyku XML a příslušný soubor zpracovat.

Postup bude tedy následující. V prvním kroku musíme nejprve získat daný XML soubor, který stáhneme přímo ze serveru. Adresu musíme samozřejmě znát, ale tu najdeme na každém serveru, který RSS nabízí. Ve druhém kroku pak musíme na soubor pustit "XML parser", který nám jej přežvýká a vyplivne ve srozumitelnější podobě. Tím získáme již náš požadovaný seznam článků s odkazy, které jen ve vhodné formě zobrazíme a pokud uživatel na odkaz klikne, otevřeme danou webovou stránku v prohlížeči a nebo přímo v našem programu v komponentě WebBrowser.

Klíčová je tedy část, ve které potřebujeme zpracovat XML soubor. Naštěstí, a to je celé tajemství dnešního dílu, máme na paletě komponent na záložce Internet úžasnou komponentu TXMLDocument, která udělá skoro celou práci za nás.

Pustíme se tedy do toho. Na prázdný formulář si připravíme komponentu ListView, do které budeme vypisovat získaný seznam. Komponentu přepneme do režimu zobrazení vsReport a vytvoříme si tři sloupce - Titulek, URL a Popis. Dále si připravíme Editbox pro vložení adresy XML souboru a tlačítko, kterým celou akci spustíme.

Nejprve potřebujeme stáhnout příslušný XML soubor ze zadané adresy. K tomu nám s využitím knihovny ExtActns pomůže následující jednoduchá funkce:

function DownloadURLFile(const RSS, RSSLocal: TFileName): boolean;
begin
  Result := True;
  with TDownLoadURL.Create(nil) do
  try
    URL := RSS;
    Filename := RSSLocal;
    try
      ExecuteTarget(nil);
    except
      Result := False;
    end;
  finally
    Free;
  end;
end;

Ta má dva parametry, první je vzdálená adresa XML souboru, druhým parametrem je pak adresa lokální, kam se soubor uloží.

Máme-li soubor na disku, pustíme na něj XML parser v podobě knihovny TXMLDocument. V cyklu budeme dokument procházet (jeho jednotlivé elementy) a narazíme-li na prvek item, což je právě náš požadovaný záznam, přidáme prvek do seznamu ListView, resp. ještě jej rozdělíme na části title, link a description.

procedure TForm1.Button1Click(Sender: TObject);
var
  RSS: string;
  LocalRSS: TFileName;
  StartItemNode: IXMLNode;
  ANode: IXMLNode;
  STitle, sDesc, sLink: widestring;
begin
  RSS := Edit1.Text;
  LocalRSS := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName)) + `local.xml`;
  Screen.Cursor:=crHourglass;
  try
    if not DownloadURLFile(RSS, LocalRSS)  then
    begin
      Screen.Cursor:=crDefault;
      Raise Exception.CreateFmt(`Chyba připojení!!`,[]);
      Exit;
    end;
    if not FileExists(LocalRSS) then
    begin
      Screen.Cursor:=crDefault;
      raise exception.Create(`Soubor chybně uložen!`);
      Exit;
    end;
    ListView1.Clear;
    XMLDocument1.FileName := LocalRSS;
    XMLDocument1.Active := True;
    StartItemNode := XMLDocument1.DocumentElement.ChildNodes.First.ChildNodes.FindNode(`item`);
    ANode := StartItemNode;
    repeat
      STitle := ANode.ChildNodes[`title`].Text;
      sLink := ANode.ChildNodes[`link`].Text;
      sDesc := ANode.ChildNodes[`description`].Text;
      with ListView1.Items.Add do
      begin
        Caption := STitle;
        SubItems.Add(sLink);
        SubItems.Add(sDesc)
      end;
      ANode := ANode.NextSibling;
    until ANode = nil;
  finally
    DeleteFile(LocalRSS);
    Screen.Cursor:=crDefault;
  end;
end;

No a to je vlastně vše. Přesně toto naleznete v dnešní ukázkové aplikaci. Nyní zbývá vyřešit samotné zobrazení odkazovaných dokumentů. To můžeme provést buď otevřením odkazu ve výchozím prohlížeči a nebo načtením stránky přímo do našeho programu s využitím komponenty WebBrowser. To už však nechám na vašem rozhodnutí.

Používáte-li RSS běžně, jistě víte, že ne na každém serveru je přímo odkaz na zdrojový XML soubor, ale spíše na adresu skriptu, který teprve soubor vygeneruje. Toho se ale nemusíte bát a prostě do programu vložte odkaz na tento skript. Pokud totiž na skript vznese náš program požadavek na stažení souboru, nebude pochopitelně stažen příslušný skript, ale jím vygenerovaný XML soubor, takže se vlastně nic nemění.

Tím máme tedy vytvořen celkem funkční základ pro vlastní čtečku RSS kanálů, kterou si můžete dokonale přizpůsobit vlastním požadavkům. Kompletní ukázkový projekt můžete opět stahovat zde.