Im using rome 1.0 to generate RSS for my java application.
In my 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();
The generated 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>
When RSS is validated here, it has the following recommendations:
How to do the recommendation in rome library? Is the generated RSS ok?
Thanks.
In your custom SyndFeed class, make sure that you name your Date variable differently from what's on the SyndFeed class (Ie: instead of 'publishedDate', use something like 'pubDate'. This seems to have solved the issue for 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());
}
}
So this is happening because the SyndFeedImpl
uses the same field for the date and publishedDate fields (from the DC Module) :
@Override
public Date getPublishedDate() {
return getDCModule().getDate();
}
@Override
public void setPublishedDate(final Date publishedDate) {
getDCModule().setDate(publishedDate);
}
Since the RSS093Generator
(used by the RSS20Generator
) creates a pubDate element from the specified item, but also inherits from the DCModuleGenerator, you get both this:
final Date pubDate = item.getPubDate();
if (pubDate != null) {
eItem.addContent(generateSimpleElement("pubDate", DateParser.formatRFC822(pubDate, Locale.US)));
}
and this:
final Date dcDate = dcModule.getDate();
if (dcDate != null) {
for (final Date date : dcModule.getDates()) {
element.addContent(generateSimpleElement("date", DateParser.formatW3CDateTime(date, Locale.US)));
}
}
This interaction can be prevented by implementing a custom SyndFeed
of your own. In this case, all you need to do is create a class variable to store your pubDate so that the DCModule
never gets a date set, and will therefore never generate your unwanted dc:date
element.
I ran into the exact same problem and solved it by using this SyndFeed
implementation:
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());
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With