2009-07-31 12 views
1

Ich verwende Rome, um mehrere Feeds zu einem zu kombinieren. Es basiert weitgehend auf auf dem Standort Rom.Einstellen einer Quelle pro Element mit Rom

Ich erstelle einen RSS 2.0-Feed, den ich als (W3C) -Dokument speichern und dann an ein Stylesheet übertrage, um es in HTML umzuwandeln.

Eine meiner Anforderungen besteht darin, die Quelle (Link zu und Name der Ursprungsseite) für jeden Eintrag anzuzeigen (wie sie aus einer Vielzahl von Quellen stammen können).

Gemäß der RSS-Spezifikation gibt es eine optional source attribute pro Artikel. Und Rom scheint dies mit einer setSource-Methode auf der SyndEntry-Schnittstelle zu unterstützen. Wenn Sie dies jedoch auf den SyndFeed des ursprünglichen Feeds einstellen, scheint dieses Attribut nicht gesetzt zu sein.

Das von mir ausgegebene Dokument enthält kein Quellelement im Element.

Irgendwelche Hinweise darauf, was ich falsch mache oder Vorschläge zu alternativen Methoden, um das zu tun, was ich tun möchte?

Vielen Dank im Voraus, Darren.

Antwort

1

Ich habe für diesen Moment eine Abhilfe gefunden.

Da ich nur wirklich einen Namen als Attribution angeben muss überschreibe ich das Autorfeld wie folgt.

SyndEntry entry = // fetched from SyndFeed 
Module dcModule = entry.getModule(DCModule.URI); 
String title = // My overridden title 
if (dcModule != null && title != null) { 
    ((DCModule)dcModule).setCreator(title); 
} 

Der Grund, warum ich diesen Code verwenden, anstatt SyndEntry.setAuthor ist, dass fordern, dass nur der Autor setzt, wenn es null ist, müssen wir immer es unseren Wert gesetzt.

Ich verweisen Sie dann als DC: Ersteller in meinem XSL Stylesheet.

2

Ich weiß, es ist ein bisschen spät für die Antwort, aber vielleicht wird jemand später verwenden. Ich habe es mit Rom 1.0 getan.

Sie können Ihren eigenen Konverter und Generator definieren.

Mein Bedarf war ein RSS 2.0 Feed mit Quellfeld in Elemente. Sowohl für den Konverter als auch für den Generator erweitere ich die Implementierung von RSS 2.0 durch ROM.

Zuerst brauchen wir einen Konverter. Es ist derjenige, der die Quelle füllt

/** 
* This is a convertor for RSS 2.0 setting source on output items 
*/ 
public class ConverterForRSS20WithSource extends ConverterForRSS20 { 

    /** 
    * Default Constructor 
    */ 
    public ConverterForRSS20WithSource() { 
     this("rss_2.0_withSource"); 
    } 

    /** 
    * Constructor with type 
    * @param type 
    */ 
    protected ConverterForRSS20WithSource(String type) { 
     super(type); 
    } 

    /** 
    * @see com.sun.syndication.feed.synd.impl.ConverterForRSS094#createRSSItem(com.sun.syndication.feed.synd.SyndEntry) 
    */ 
    @Override 
    protected Item createRSSItem(SyndEntry sEntry) { 
     Item item = super.createRSSItem(sEntry); 
     if(sEntry.getSource() != null 
       && StringUtils.isNotBlank(sEntry.getSource().getUri())) { 
      Source s = new Source(); 
      s.setUrl(sEntry.getSource().getUri()); 
      s.setValue(sEntry.getSource().getTitle()); 
      item.setSource(s); 
     } 

     return item; 
    } 
} 

Dann brauchen wir einen Generator. Es hat nichts besonderes zu tun. Es musste einfach sein

/** 
* Rss 2.0 Generator with source field 
*/ 
public class RSS020GeneratorWithSource extends RSS20Generator { 

    /** 
    * 
    */ 
    public RSS020GeneratorWithSource() { 
     super("rss_2.0_withSource","2.0"); 
    } 

} 

Wir müssen eine letzte Dinge tun, erklären unsere Klassen zu Rom. Setzen Sie dazu einfach eine rom.properties in die Wurzel Ihrer Ressourcen. Vergessen Sie nicht, den Dublin Core zu Ihrem rss.items hinzuzufügen ... In dieser Datei setzen nur

Converter.classes=my.package.ConverterForRSS20WithSource 

WireFeedGenerator.classes=my.package.RSS020GeneratorWithSource 

# Parsers for RSS 2.0 with source item modules 
# 
rss_2.0_withSource.item.ModuleParser.classes=com.sun.syndication.io.impl.DCModuleParser 

# Generators for RSS_2.0 entry modules 
# 
rss_2.0_withSource.item.ModuleGenerator.classes=com.sun.syndication.io.impl.DCModuleGenerator 

Und das ist alles.

Verwandte Themen