2013-02-21 4 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>, потому что средство проверки подачи генерирует эту ошибку:

An item should not include both pubDate and dc:date 

Как это решить? Я хотел бы использовать этот плагин, но мне нужен действующий RSS.

+0

мой вопрос на самом деле, что unsolveable? –

+0

Какая программа проверки фида вы используете? – lucke84

+0

используя http://validator.w3.org/feed/ –

ответ

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 напрямую, чтобы получить строковое представление фида, затем он анализирует его и теги «dc: date» удаляются. Результат получается как обычно.

Я проверил этот метод обхода внутри плагина тестов с Граалей 1.3.7

+0

Да, также отлично работает на 2.2.0! большое спасибо –