2009-07-31 11 views
1

Romeを使用して複数のフィードを1つに結合しています。 これは主にローマサイトのthis exampleに基づいています。ローマを使用してアイテムごとにソースを設定する

私は(W3C)ドキュメントとして保存し、次にHTMLに変換するスタイルシートに渡すRSS 2.0フィードを作成しています。

私の要件の1つは、さまざまなソースから来る可能性があるため、各エントリのソース(元のサイトへのリンクと名前)を表示することです。

RSS仕様によれば、アイテムごとにoptional source attributeがあります。 そして、ローマはこれを、SyndEntryインターフェイスのsetSourceメソッドでサポートしているようです。 ただし、これを元のフィードのSyndFeedに設定しても、この属性は設定されていません。

出力したドキュメントには、アイテムにソース要素が含まれていません。

私がやりたいことをやるための別の方法について間違ったり提案していることの手掛かりはありますか?

おかげさまで、ダレン。

答えて

1

私は今のところ回避策を見つけました。

私は実際に属性として名前を付ける必要があるため、著者フィールドは次のようにオーバーライドしています。

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); 
} 

私が代わりにSyndEntry.setAuthorのこのコードを使用する理由は、それがnullだ場合にのみ、著者を設定することを呼び出して、我々は常に我々の値に設定する必要があるということです。

これを私のXSLスタイルシートのdc:creatorとして参照してください。

2

私はそれが応答に少し遅れていることは知っていますが、誰かがこれを後で使用するかもしれません。 私はローマ1.0でそれをしました。

独自のコンバータとジェネレータを定義できます。

私の必要性は、項目にソースフィールドを含むRSS 2.0フィードでした。だからコンバータとジェネレータの両方私はRSS 2.0の実装をローマで拡張します。

まずはコンバータが必要です。ソースを埋める人です。

/** 
* 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; 
    } 
} 

次に、ジェネレーターが必要です。それは特別なことは何もありません。ちょうど

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

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

} 

私たちのクラスをromeに宣言する必要があります。そのためには、単にリソースのルートにrome.propertiesを置いてください。 があなたのrss.itemsにダブリンコアを追加することを忘れないでください...そのファイルで はちょうど

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 

を入れて、それがすべてです。

関連する問題