Validation Grails提要插件<;pubDate>&&&书信电报;dc:日期>;,验证错误
我刚刚试用了grailsfeeds插件 它工作起来很简单,也很好,但有一件事我不明白 一旦我添加了一个发布日期,比如:Validation Grails提要插件<;pubDate>&&&书信电报;dc:日期>;,验证错误,validation,grails,groovy,rss,feed,Validation,Grails,Groovy,Rss,Feed,我刚刚试用了grailsfeeds插件 它工作起来很简单,也很好,但有一件事我不明白 一旦我添加了一个发布日期,比如: reviews.each() { review -> entry('fooTitle'){ publishedDate = review.dtCreated review.rating + ' ' + review.comment } } 它生成两个标记:
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>
但我只希望生成
,因为提要验证器会抛出以下错误:
An item should not include both pubDate and dc:date
我怎样才能解决这个问题?我很想使用这个插件,但我需要一个有效的RSS。如果你不介意一个快速而肮脏的解决方案,你可以试试这个(它来自插件的集成测试和修改): 基本上,它所做的是直接调用feedbuilder来获取提要的字符串表示形式,然后对其进行解析并删除“dc:date”标记。结果会像往常一样呈现
我已经用grails 1.3.7在插件测试套件中测试了这个变通方法,我的问题真的有那么难解决吗?你使用的是哪个提要验证器?使用的是什么
An item should not include both pubDate and dc:date
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"
}
}