2013-02-21 55 views
0

我只是嘗試了Grails的飼料,插件http://grails.org/Feeds+PluginGrails的飼料,插件,<pubDate> && <dc:date>,驗證錯誤

它的工作原理很簡單,很好,但there's有一件事我不明白。

只要我添加了一個publishedDate,如:

 reviews.each() { 
     review -> entry('fooTitle'){ 
      publishedDate = review.dtCreated 
      review.rating + ' ' + review.comment 
     } 
    } 

它產生兩個標籤:

 <pubDate>Tue, 04 Sep 2012 12:10:02 GMT</pubDate> 
     <dc:date>2012-09-04T12:10:02Z</dc:date> 

在數據庫中的條目是:

"dtCreated": ISODate("2013-01-15T00:52:47.0Z"), 

,但我只想要要生成<pubDate>,因爲Feed驗證器會拋出此錯誤:

An item should not include both pubDate and dc:date 

我該如何解決這個問題?我很樂意使用這個插件,但我需要一個有效的RSS。

+0

是我的問題真的那麼unsolveable裏面? – 2013-02-26 10:49:03

+0

您正在使用哪種Feed驗證器? – lucke84 2013-02-27 17:09:16

+0

使用http://validator.w3.org/feed/ – 2013-02-28 10:22:11

回答

2

如果你不介意一個快速和骯髒的解決方案,你可以試試這個(它是從插件的集成測試採取和修改):

import groovy.xml.XmlUtil 
import groovy.xml.StreamingMarkupBuilder 
import feedsplugin.FeedBuilder 
import com.sun.syndication.io.SyndFeedOutput 

class TestController { 
private renderToString(feedType, feedVersion, Closure closure) { 
    def builder = new FeedBuilder() 
    builder.feed(closure) 

    def type = feedType 
    def version = feedVersion 

    SyndFeedOutput output = new SyndFeedOutput() 
    def sw = new StringWriter() 
    output.output(builder.makeFeed(type, version),sw) 
    sw.toString() 

} 

private removeDcDate(String rssFeed) { 

    def dom = new XmlSlurper().parseText(rssFeed) 
    dom.channel[0].item.eachWithIndex { item, i -> 
     dom.channel[0].item[i].date = {} 
    } 

    def newResp = XmlUtil.serialize(new StreamingMarkupBuilder().bind { 
     mkp.declareNamespace (rdf:"http://www.w3.org/1999/02/22-rdf-syntax-ns#") 
     mkp.declareNamespace (dc:"http://purl.org/dc/elements/1.1/") 
     mkp.declareNamespace (content:"http://purl.org/rss/1.0/modules/content/") 
     mkp.declareNamespace (itunes:"http://www.itunes.com/dtds/podcast-1.0.dtd") 
     mkp.declareNamespace (taxo:"http://purl.org/rss/1.0/modules/taxonomy/") 

     mkp.yield dom 
    }) 

    newResp 

} 

def test = { 
    def articles = ['A', 'B', 'C'] 

    def outStr= renderToString("rss", "2.0") { 
     title = 'Test feed' 
     link = 'http://somewhere.com/' 
     description = "This is a test feed" 

     articles.each() { article -> 
      entry("Title for \$article") { 
       content(type:'text/html') { 
        return "Content for \$article" 
       } 

       link = 'http://somewhere.com/x' 

       publishedDate = new Date() 

      } 
     } 
    } 
    def cleanedFeed = removeDcDate(outStr) 

    render text: cleanedFeed, contentType: "application/rss+xml", encoding: "UTF-8" 

    } 
} 

基本上它呼籲feedbuilder直接得到一個字符串表示的Feed,然後解析它並刪除「dc:date」標籤。結果如往常一樣呈現。

我測試過此變通辦法插件測試套件使用Grails 1.3.7

+0

是啊,在2.2.0上也工作得很好!非常感謝 – 2013-02-28 17:04:33