Skip to content


RSSCreator – Teil 2

Mittlerweile hab ich es geschafft, einen kompletten RSS-Feed erstellen zu lassen. Dabei wird erst der Feed mit allen Informationen zum channel erstellt und nachträglich können die Items hinzugefügt werden. Dabei musste natürlich beachtet werden, dass neueste Beiträge in einem Feed immer ganz oben stehen. Aufgrund dessen habe ich mich auch entschlossen, die Items in Form einer OrderedCollection anzulegen. Doch fangen wir erstmal vorn an.

Mit der ersten Implementation hatte ich lediglich eine Klasse: RSSCreator. Da nun allerdings die Überlegung kam, Items als einzelne Objekte in den Feed einzufügen, fiel mir auf, dass ich diese von RSSCreator ableiten kann. Folgerichtig und eine konsistente Programmierweise beibehaltend, entschloss ich mich dann, auch den Channel über eine Ableitung erstellen zu lassen. Dadurch hab ich nun die folgenden drei Klassen:

  • RSSCreator
    • RSSFeedChannel
    • RSSFeedChannelItem

FeedChannel und FeedChannelItem erben dabei jeweils von RSSCreator, da dort auch die Methoden definiert sind, die ich im letzten Post schon erwähnte. Somit kann ich auch in den Subklassen die Tags wie bekannt erstellen lassen.

Doch das Hinzufügen der Instanzvariable channel in RSSCreator ist es mir möglich, auf den channel als Objekt zuzugreifen. Daraus hab ich mich entschlossen, die folgende Methode in RSSFeedChannel zu definieren:

RSSFeedChannel >> addChannelItem: aRSSFeedChannelItem
  self items addFirst: aRSSFeedChannelItem

Wie bereits erwähnt, handelt es sich bei items um eine OrderedCollection. Da ein neues Item-Objekt an den Anfang eingefügt wird, ist somit die korrekte RSS-Item-Reihenfolge gegeben. Durch die Ableitung von RSSCreator, lässt sich nun auch ein Item relativ einfach erstellen:

RSSChannelFeedItem >> createItem
  self rssFeedStream resetToStart.
  self addTag: 'item' withContent: [
    self addTag: 'title' withValue: self title.
    self addTag: 'link' withValue: self link.
    self addTag: 'description' withValue: self description.
    self addTag: 'guid' withValue: self link]

Was mir besonders gut gefällt, dass durch die generische Verwendung der hinzuzufügenden Attribute, die Items, aber auch alle anderen Objekte schnell um Tags erweitern lässt.

Wie sieht nun, die Erstellung des Channels in der Basisklasse RSSCreator aus:
Als erstes wird der Feed mit seinen Kopfdaten erstellt, daraufhin der Channel angelegt:

RSSCreator >> createChannel
  self channel createChannel.
  self rssFeedStream nextPutAll: self channel getChannel
RSSFeedChannel >> createChannel
  self rssFeedStream resetToStart.
  self addTag: 'channel' withContent: [
    self addTag: 'title' withValue: self title.
    self addTag: 'link' withValue: self link.
    self addTag: 'description' withValue: self description.
    self addTag: 'language' withValue: self language.
    self addTag: 'copyright' withValue: self copyright.
    self addTag: 'managingEditor' withValue: self managingEditor.

    self items do:[ :item |
      self rssFeedStream nextPutAll: item getItem]]

Nun fehlt im Grunde nur noch ein Webinterface, um sich seinen Feed selbst zu erstellen. Natürlich ist das Einsatzgebiet auch weiter gefasst. Da der RSSCreator jeweils den String mit dem kompletten Feed zurückgibt, kann dieser also in jeder Webapplikation eingesetzt werden. Beispielsweise, um sich einen Feed erstellen und in einer XML-Datei zu speichern.

Posted in Programming, RSS, Smalltalk, Tools.

Share it