2009-07-13 13 views
4

Ich verwende .NET SyndicationFeed, um RSS und ATOM-Feeds zu erstellen. Unglücklicherweise benötige ich HTML-Inhalt im description-Element (die Content-Eigenschaft des SyndicationItem) und der Formatierer kodiert automatisch den HTML-Code, aber ich würde lieber das gesamte Beschreibungselement in CDATA einschließen, ohne den HTML-Code zu codieren.SyndicationFeed: Inhalt als CDATA?

My (einfach) Code:

var feed = new SyndicationFeed("Title", "Description", 
       new Uri("http://someuri.com")); 
var items = new List<SyndicationItem>(); 

var item = new SyndicationItem("Item Title", (string)null, 
       new Uri("http://someitemuri.com")); 

item.Content = SyndicationContent.CreateHtmlContent("<b>Item Content</b>"); 

items.Add(item); 
feed.Items = items; 

jemand eine Idee, wie ich das SyndicationFeed mit tun kann? Mein letzter Ausweg ist, den XML-Code für die Feeds "manuell" zu erstellen, aber ich würde lieber den integrierten SyndicationFeed verwenden.

Antwort

7

Das ist für mich gearbeitet:

public class CDataSyndicationContent : TextSyndicationContent 
{ 
    public CDataSyndicationContent(TextSyndicationContent content) 
     : base(content) 
    {} 

    protected override void WriteContentsTo(System.Xml.XmlWriter writer) 
    { 
     writer.WriteCData(Text); 
    } 
} 

dann können Sie:

new CDataSyndicationContent(new TextSyndicationContent(content, TextSyndicationContentKind.Html)) 
+0

Das hat auch für mich funktioniert. – thelsdj

+0

Tolle Lösung, genau das, was ich gesucht habe. –

+7

Ich habe versucht, das gleiche zu tun - neue CDataSyndicationContent (new TextSyndicationContent ("

" + d.Description, TextSyndicationContentKind.Html)); aber es codiert immer noch den html? Beim Zurückverfolgen des Codes wird WriteContentsTo nie aufgerufen. – TimLeung

-2

versuchen

item.Content = "<![CDATA[" + 
      SyndicationContent.CreateHtmlContent("<b>Item Content</b>") + "]]>"; 
+0

thx, aber nicht funktioniert (Compilerfehler), da item.Content ein SyndicationContent-Objekt erfordert. Andersherum ist auch nicht funktioniert, wird der Inhalt einschließlich der CDATA-Tags codiert wird: "<[+ "Eintrag Inhalt" +„] item.Content = SyndicationContent.CreateHtmlContent (! CDATA ["]>) "; –

3

Diese funktionieren sollte.

item.Content = new TextSyndicationContent("<b>Item Content</b>",TextSyndicationContentKind.Html); 
+0

SyndicationContent.CreateHtmlContent() umschließt das Obige, so dass das Ergebnis das gleiche ist, das Sie verwenden. Ich glaube, das Problem tritt auf, wenn Sie versuchen, den Feed in den XmlWriter zu schreiben. –

1

versuchen, diese

XmlReaderSettings settings = new XmlReaderSettings(); 
      settings.IgnoreComments = false; 
      //settings.ProhibitDtd = false; 
      using (XmlReader reader = XmlReader.Create(rssurl, settings)) 
2

ich das gleiche Problem wie einige hatten, wo die WriteContentsTo Überschreibung wurde nicht in cpowers Beispiel aufgerufen (immer noch keine ID Warum? Also habe ich es geändert, um stattdessen von der SyndicationContent-Klasse zu erben. Ich bin mir nicht sicher, ob dies die beste Lösung ist, aber es hat in meiner Situation gut funktioniert.

public class CDataSyndicationContent : SyndicationContent 
{ 
    public CDataSyndicationContent(string content) 
    { 
     Text = content; 
    } 

    public override SyndicationContent Clone() 
    { 
     return new CDataSyndicationContent(Text); 
    } 

    public override string Type 
    { 
     get { return "html"; } 
    } 

    public string Text { get; private set; } 

    protected override void WriteContentsTo(XmlWriter writer) 
    { 
     writer.WriteCData(Text); 
    } 
} 
+0

Es scheint, dass die Funktionalität je nach Versionen von .NET unterschiedlich ist, aber diese Lösung von @WonderGrub hat es für mich auf .NET 4.0 behoben. Um den Inhalt einzustellen, benutze einfach: 'item.Content = new CDataSyndicationContent (" Item Inhalt ")' – icewhite

3

Für jene, für die die Lösung von cpowers und WonderGrub sofern auch nicht funktioniert, können Sie die folgende Frage SO sollten überprüfen, für mich, weil diese Frage zu meinem Auftreten dieses Problems tatsächlich war die Antwort! Rss20FeedFormatter Ignores TextSyndicationContent type for SyndicationItem.Summary

von der positiven Antwort zu urteilen thelsdj und Andy Rose und dann später die ‚negative‘ Antwort von TimLeung und die Alternative von WonderGrub angeboten Ich würde schätzen, dass das Update von cpowers angeboten gestoppt in einer späteren Version von ASP.NET arbeiten oder so.

In jedem Fall löste die Lösung im obigen SO-Artikel (abgeleitet von David Whitneys Code) das Problem mit ungewollter HTML-Codierung in CDATA-Blöcken in einem RSS 2.0-Feed für mich. Ich habe es in einer ASP.NET 4.0 WebForms-Anwendung verwendet. Hier

1

ist das, was wir haben:

public class XmlCDataWriter : XmlTextWriter 
     { 
      public XmlCDataWriter(TextWriter w): base(w){} 

      public XmlCDataWriter(Stream w, Encoding encoding): base(w, encoding){} 

      public XmlCDataWriter(string filename, Encoding encoding): base(filename, encoding){} 

      public override void WriteString(string text) 
      { 
       if (text.Contains("<")) 
       { 
        base.WriteCData(text); 
       } 
       else 
       { 
        base.WriteString(text); 
       } 
      } 

     } 

Und dann die Klasse zu verwenden:

public StringBuilder CDataOverwiriteMethod(Rss20FeedFormatter formatter) 
     { 
      var buffer = new StringBuilder(); 

      //could be streamwriter as well 
      using (var stream = new StringWriter(buffer)) 
      { 
       using (var writer = new XmlCDataWriter(stream)) 
       { 
        var settings = new XmlWriterSettings() {Indent = true}; 

        using (var xmlWriter = XmlWriter.Create(writer, settings)) 
        { 
         formatter.WriteTo(xmlWriter); 
        } 
       } 
      } 

      return buffer; 
     } 
0

Der kürzeste Weg, dies zu tun ist:

.Content = SyndicationContent.CreateXhtmlContent("<![CDATA[The <em>content</em>]]>") 

Das ausgegeben wird in der XML als

<entry> 
    … 
    <content type="xhtml"><![CDATA[The <em>content</em>]]></content> 
    … 
</entry> 

Nicht eine elegante Lösung, ich gebe zu, aber es funktioniert einwandfrei - nur an einem Projekt von mir versucht.