2012-11-09 8 views
6

Im przy użyciu rome 1.0 do generowania RSS dla mojej aplikacji java.Valid RSS 2.0 Używanie Rome

W moim 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(); 

Wygenerowany RSS:

<?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> 

Kiedy RSS jest weryfikowany here, ma następujące zalecenia:

  • Przedmiot nie powinien obejmować zarówno pubDate i dc: date
  • M issing atom: link z rel = "self"

Jak zrobić rekomendację w rzymskiej bibliotece? Czy wygenerowany RSS jest w porządku?

Dzięki.

+0

Częściowe odpowiedzi [atomu: Link w RSS używając Rome] (http://stackoverflow.com/questions/18112949/atomlink-in-rss-using-rome). – Joe

+0

Chciałem tylko wspomnieć, że odpowiedź @ JoshC13 rzeczywiście działa, ale powinna być zastosowana do 'SyndEntryImpl' zamiast' SyndFeedImpl', ponieważ zduplikowana data ma miejsce pod '' elementem –

Odpowiedz

1

Więc tak się dzieje, ponieważ SyndFeedImpl korzysta z tej samej dziedziny, w polu daty i publishedDate (z modułem DC):

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

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

Ponieważ RSS093Generator (używany przez RSS20Generator) tworzy element pubDate przeprowadzoną określony element, ale również dziedziczy od DCModuleGenerator, można uzyskać zarówno to:

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

a to:

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

Tej interakcji można zapobiec, wprowadzając niestandardową własną własną wersję SyndFeed. W tym przypadku wszystko, co musisz zrobić, to utworzyć zmienną klasy do przechowywania twojego PubDate, aby DCModule nigdy nie został ustawiony na datę i dlatego nigdy nie wygeneruje niechcianego elementu dc:date.

wpadłem na dokładnie taki sam problem i rozwiązać go za pomocą tego SyndFeed realizacji:

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

w Twojej klasie SyndFeed, upewnij się, że nazwa zmienną Date odmiennie od tego, co znajduje się na klasie SyndFeed (IE :. zamiast „publishedDate”, użyj czegoś podobnego „pubDate” wydaje się, że rozwiązali problem dla mnie

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! Widzę, że jesteś nowy tutaj, więc po prostu heads-up.Zwykle staramy się rezerwować odpowiedzi na nowe techniki lub podejścia i wykorzystywać komentarze do małych addendów, takich jak zmiana nazw zmiennych, ponieważ nie stanowią one alternatywnego podejścia. Rozumiem twoją trudność, ponieważ wymagania dotyczące reputacji na razie ograniczają limit komentarzy. Być może stwierdzenie twojego problemu tutaj: http://meta.stackexchange.com/questions/12119/lower-the-amount-reputation-needed-to-comment byłoby użyteczne. – JoshC13

1

trochę późno do partii, ale tutaj nie ma odpowiedzi działa po wyjęciu z pudełka, więc pomyślałem. Dodałbym mój.

Jak @Vitor wskazuje w swoim komentarzu, poprawny sposób wykonania tego w celu rozszerzenia SyndEntryImpl i użycia go jako 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()); 
    } 
}