API dostępu do danych z kanałów

 

Firefox 2 oraz Thunderbird 2 wprowadzają serię interfejsów, które pozwalają programistom rozszerzeń w łatwy sposób uzyskiwać dostęp do kanałów RSS i Atom.

Interfejsy kanałów

nsIFeed
Reprezentuje kanał RSS lub Atom.
nsIFeedContainer
Bazowa klasa, z której dziedziczy kilka interfejsów związanych z kanałami.
nsIFeedElementBase
Bazowa klasa, z której dziedziczy kilka interfejsów związanych z kanałami.
nsIFeedEntry
Reprezentuje pojedynczy wpis kanału RSS lub Atom.
nsIFeedGenerator
Opisuje software, za pomocą którego wygenerowano kanał RSS lub Atom.
nsIFeedPerson
Reprezentuje osobę. Zawiera imię oraz nazwisko osoby, jej adres email oraz adres jej strony domowej.
nsIFeedProcessor
Parsuje kanały RSS oraz Atom.
nsIFeedProgressListener
Zaimplementowane przez program chcący parsować kanały RSS lub Atom w celu otrzymywania wiadomości podczas procesu parsowania.
nsIFeedResult
Opisuje rezultat parsowania kanału.
nsIFeedResultListener
Zaimplementowane przez program chcący parsować kanały RSS lub Atom w celu otrzymywania potwierdzenia ukończenia procesu prasowania.
nsIFeedTextConstruct
Reprezentuje tekst w wątku; zawiera funkcje pozwalające na pobranie danego tekstu wyłącznie jako tekst lub HTML.
nsIScriptableUnescapeHTML
Klasa użytkowa przywracająca ciągi znaków HTML.

Przykład: Czytanie kanału z sieci

Bardzo łatwo można odczytać oraz parsować kanał. Użyj XMLHttpRequest by pobrać kanał, potem przekaż jego łańcuch do nsIFeedProcessor w celu przetworzenia.

Pobieranie kanału oraz wysyłanie go do parsowania może zostać zrobione za pomocą kodu podobnego do przedstawionego poniżej:

  fetch: function(feedUrl)
  {
    var httpRequest = null;
    
    function infoReceived() {
      var data = httpRequest.responseText;
      
      var ioService = Components.classes['@mozilla.org/network/io-service;1']
                                         .getService(Components.interfaces.nsIIOService);
      var uri = ioService.newURI(feedUrl, null, null);
      
      if (data.length) {
        var parser = Components.classes["@mozilla.org/feed-processor;1"]
                                        .createInstance(Components.interfaces.nsIFeedProcessor);
        var listener = new FeedTestResultListener();
        try {
          parser.listener = listener;
          parser.parseFromString(data, uri);
        }
        catch(e) {
          alert("Error parsing feed.");
        }
      }
    }
    
    httpRequest = new XMLHttpRequest();
    
    httpRequest.open("GET", feedUrl, true);
    try {
      httpRequest.onload = infoReceived;
      httpRequest.send(null);
    }
    catch(e) {
      alert(e);
    }
  }

Interfejs nsIFeedProcessor pozwala na parsowanie danych kanału z kilku możliwych źródeł; w tym przypadku ładujemy dokument do łańcucha, a następnie parsujemy go za pomocą metody parseFromString(). Można też parsować go z pliku za pomocą parseFromStream(), lub też bezpośrednio z adresu za pomocą parseAsync().

Właściwe parsowanie kanału dokonywane jest za pomocą metody nazywanej handleResult() na obiekcie FeedTestResultListener. Kod wygląda następująco:

    FeedTestResultListener.prototype = {
      handleResult: function(result) {
        var feed = result.doc;
        
        feed.QueryInterface(Components.interfaces.nsIFeed);
    
        // Otwórz nowe okno
    
        var win = window.open("", "FeedTest_Window");
        var doc = win.document;
    
        doc.open();
        
        // Zapisz nagłówek HTML oraz tytuł strony
        
        doc.write("<html><head><title>Feed: " + feed.title.text + "</title></head><body>");
        doc.write("<h1>" + feed.title.text + "</h1><p>");
          
        var itemArray = feed.items;
        var numItems = itemArray.length;
        
        // Zapisz informacje zawartą w artykule
        
        if (!numItems) {
          doc.write("<i>No news is good news!</i>");
        }
        else {
          var i;
          var theEntry;
          var theUrl;
          var info;
          
          for (i=0; i<numItems; i++) {
            theEntry = itemArray.queryElementAt(i, Components.interfaces.nsIFeedEntry);
            
            if (theEntry) {
              theUrl = 
              doc.write('<b><a href="' + theEntry.link.resolve("") + '">' + theEntry.title.text + '</a></b><br>');
              if (theEntry.summary) {
                info = theEntry.summary.text + "<p><hr><p>";
              }
              else {
                info = theEntry.content.text + "<p><hr><p>";
              }
              doc.write("<blockquote>" + info);
              doc.write("</blockquote><p>");
            }
          }
        }
        
        // Zamknij dokument
        
        doc.write("</body></html>");
        doc.close();
      }
    }

Funkcja handleResult() otrzymuje jako argumenty obiekt typu nsIFeedResult opisujący kanał, oraz doc typu nsIFeed zawierające wszystkie dane kanału.

W celu uzyskania tytułu kanału należy spojrzeć na właściwość feed.title. Tytuł jest nsIFeedTextConstruct reprezentujący tekst zapisany w rożnych formatach; używając właściwości text uzyskamy tytuł kanału w formacie HTML. Można również użyć metody plainText() by uzyskać kopię jako zwykły tekst.

Następnie można przejrzeć uszeregowanie kanału za pomocą feed.items nsIArray. Uszeregowanie to zawiera obiekty nsIFeedEntry opisujące każdy składnik kanału.

Tworzenie zawartości dokumentu następuje poprzez pobranie tytułu, linka, podsumowania oraz zawartości własności poszczególnych składników. Pełny adres linka może zostać pobrany za pomocą metody linka resolve().

W celu rozpoczęcia pobierania kanału wywołujemy po prostu fetch( url ). Otwierane jest wtedy nowe okno zawierające składniki kanału, których linki pozwalają na bezpośrednie odczytanie artykułu.

Szczegóły dostępu do poszczególnych interfejsów dostępowych kanału można znaleźć klikając w poniższe odnośniki.

Autorzy i etykiety dokumentu

Ostatnia aktualizacja: SphinxKnight,