2012-11-09 10 views
6

Sto usando rome 1.0 per generare RSS per la mia applicazione java.Valid RSS 2.0 Utilizzo di Roma

Nel mio java:

SyndFeed feed = new SyndFeedImpl(); 
    feed.setFeedType("rss_2.0"); 
    feed.setTitle("My Site"); 
    feed.setLink("http://example.com"); 
    feed.setDescription("Test Site.");  

    List<SyndEntry> entries = new ArrayList<SyndEntry>(); 
    SyndEntry entry = null; 
    SyndContent description = null; 

    entry = new SyndEntryImpl(); 
    entry.setTitle("Entry1"); 
    entry.setLink("http://example.com/entry1"); 
    entry.setPublishedDate(new Date()); 

    description = new SyndContentImpl(); 
    description.setType("text/html"); 
    description.setValue("This is the content of entry 1."); 
    entry.setDescription(description); 

    entries.add(entry); 
    feed.setEntries(entries); 

    Writer writer = new FileWriter("/home/jr/Desktop/stream.xml"); 
    SyndFeedOutput output = new SyndFeedOutput(); 
    output.output(feed,writer); 
    writer.close(); 

RSS generato:

<?xml version="1.0" encoding="UTF-8"?> 
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"> 
    <channel> 
    <title>My Site</title> 
    <link>http://example.com</link> 
    <description>Test Site.</description> 
    <item> 
     <title>Entry1</title> 
     <link>http://example.com/entry1</link> 
     <description>This is the content of entry 1.</description> 
     <pubDate>Fri, 09 Nov 2012 01:28:57 GMT</pubDate> 
     <guid>http://example.com/entry1</guid> 
     <dc:date>2012-11-09T01:28:57Z</dc:date> 
    </item> 
    </channel> 
</rss> 

Quando RSS viene convalidato here, ha le seguenti raccomandazioni:

  • Un elemento non dovrebbe includere sia pubData e dc: data
  • M issing atomo: link con rel = "self"

Come fare la raccomandazione nella libreria di Roma? L'RSS generato è ok?

Grazie.

+0

parzialmente risolta in [atomo: Link RSS usando Roma] (http://stackoverflow.com/questions/18112949/atomlink-in-rss-using-rome). – Joe

+0

Volevo solo dire che la risposta di @ JoshC13 funziona davvero, ma dovrebbe essere applicata a 'SyndEntryImpl' invece di' SyndFeedImpl', poiché la data duplicata si verifica sotto l'elemento '' –

risposta

1

Quindi questo sta accadendo perché il SyndFeedImpl utilizza lo stesso campo per la data e campi publishedDate (dal modulo DC):

@Override 
public Date getPublishedDate() { 
    return getDCModule().getDate(); 
} 

@Override 
public void setPublishedDate(final Date publishedDate) { 
    getDCModule().setDate(publishedDate); 
} 

Dal momento che l'RSS093Generator (utilizzato dal RSS20Generator) crea un elemento pubDate dal elemento specificato, ma eredita anche dal DCModuleGenerator, si ottiene sia questo:

final Date pubDate = item.getPubDate(); 
     if (pubDate != null) { 
      eItem.addContent(generateSimpleElement("pubDate", DateParser.formatRFC822(pubDate, Locale.US))); 
     } 

e questo:

final Date dcDate = dcModule.getDate(); 
if (dcDate != null) { 
    for (final Date date : dcModule.getDates()) { 
     element.addContent(generateSimpleElement("date", DateParser.formatW3CDateTime(date, Locale.US))); 
    } 
} 

Questa interazione può essere prevenuta implementando uno personalizzato SyndFeed. In questo caso, tutto ciò che devi fare è creare una variabile di classe per archiviare il tuo pubDate in modo che lo DCModule non ottenga mai una data impostata, e quindi non genererà mai l'elemento dc:date indesiderato.

Ho incontrato lo stesso identico problema e risolto utilizzando questo SyndFeed implementazione:

public class CustomSyndFeed extends SyndFeedImpl { 

    protected Date publishedDate; 

    @Override 
    public Date getPublishedDate() { 
     return publishedDate; 
    } 

    @Override 
    public void setPublishedDate(final Date publishedDate) { 
     this.publishedDate = new Date(publishedDate.getTime()); 
    } 
} 
2

Nella classe SyndFeed personalizzato, assicurarsi che il nome del tuo variabile data in modo diverso da ciò che è sulla classe SyndFeed (Ie :. invece di 'publishedDate', usare qualcosa come 'pubDate' Questo sembra aver risolto il problema per me

public class CustomSyndFeed extends SyndFeedImpl { 

protected Date pubDate; 

    @Override 
    public Date getPublishedDate() { 
     return pubDate; 
    } 

    @Override 
    public void setPublishedDate(final Date pubDate) { 
     this.pubDate = new Date(pubDate.getTime()); 
    } 
} 
+0

Hello Happy Coder! Vedo che sei nuovo qui, quindi solo un testa a testa.Di solito cerchiamo di riservare risposte per nuove tecniche o approcci e utilizzare commenti per piccoli addendum come cambiare i nomi delle variabili poiché non rappresentano un approccio alternativo. Comprendo la tua situazione, dal momento che i requisiti di reputazione non consentono la sezione dei commenti per ora. Forse affermare il tuo problema qui: http://meta.stackexchange.com/questions/12119/lower-the-amount-of-reputation-needed-to-comment sarebbe utile. – JoshC13

1

po 'tardi alla festa, ma nessuna risposta qui funziona out of the box, così ho pensato. Aggiungerei il mio.

Come @Vitor indica nel suo commento, il modo corretto di fare questo per estendere SyndEntryImpl e usarlo come SyndEntry entry = new CustomEntryImpl();.

public class CustomEntryImpl extends SyndEntryImpl { 

    protected Date pubDate; 

    @Override 
    public Date getPublishedDate() { 
     return pubDate; 
    } 

    @Override 
    public void setPublishedDate(final Date pubDate) { 
     this.pubDate = new Date(pubDate.getTime()); 
    } 
}