2009-07-13 5 views
4

私は.NETのSyndicationFeedを使ってRSSフィードとATOMフィードを作成しています。残念ながら、私はdescription要素(SyndicationItemのContentプロパティ)にHTMLコンテンツが必要で、フォーマッタは自動的にHTMLをエンコードしますが、HTMLをエンコードすることなくCDATAでラップされたdescription要素全体を持っています。SyndicationFeed:CDATAとしてのコンテンツ?

私の(簡単な)コード:

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; 

誰も私がSyndicationFeedを使用して、これを行うことができる方法のアイデア?私の最後の手段は、フィードのXMLを "手動で"作成することですが、組み込みのSyndicationFeedを使用したいと考えています。

答えて

7

は、これは私のために働いてみてください:

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

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

をその後、次のことができます。

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

これも私のために働いた。 – thelsdj

+0

素晴らしい解決策、私が探していたもの。 –

+7

新しいCDataSyndicationContent(新しいTextSyndicationContent( "

" + d.Description、TextSyndicationContentKind.Html))を実行しようとしました。それはまだhtmlをエンコードしますか?コードをトレースすると、WriteContentsToは呼び出されません。 – TimLeung

-2

これは動作するはず

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

thxですが、item.ContentにはSyndicationContentオブジェクトが必要なため、動作しません(コンパイラエラー)。 周りも機能していない他の方法、CDATAタグを含むコンテンツがエンコードされています item.Content = SyndicationContent.CreateHtmlContent( "<![CDATA [" + "項目内容" +「]]> ) "; –

3

を試してみてください。

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

SyndicationContent.CreateHtmlContent()は、結果が同じであるように上記をラップします。私はあなたがXmlWriterにフィードを書き込もうとするときに問題が発生すると考えています。 –

1

この

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

を私はいくつかの場所WriteContentsToオーバーライドと同じ問題を抱えていましたcpowersの例で呼び出されていませんでした(まだidなぜか)。そこで、代わりにSyndicationContentクラスから継承するように変更しました。これが最高の解決策であるかどうかはわかりませんが、私の状況ではうまくいっています。 cpowersとWonderGrubが提供するソリューションはまた、動作しませんでした誰のため人のために

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

.NETのバージョンによって機能が異なるようですが、この解決策は@WonderGrubによって.NET 4.0で修正されています。コンテンツを設定するには、次のようにします: 'item.Content = new CDataSyndicationContent(" Item Content ")' – icewhite

3

私にとって、この質問は、実際にこの問題の私の出現への答えだったので、あなたは、以下のSO質問をチェックアウトする必要があります!私はcpowersによって提供される修正プログラムは、ASP.NETのいくつかの将来のバージョンで動作を停止することを推定します後で、その後TimLeungから「負」の応答とWonderGrubが提供する代替案をthelsdjAndy Roseから肯定的な回答から判断すると Rss20FeedFormatter Ignores TextSyndicationContent type for SyndicationItem.Summary

か何か。

いずれにしても、上記の記事(David Whitneyのコードから派生したもの)の解決策は、RSS 2.0フィードのCDATAブロックでの不要なHTMLエンコーディングの問題を解決しました。私はASP.NET 4.0 WebFormsアプリケーションで使用しました。クラスを使用するために、その後

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); 
       } 
      } 

     } 

そして:ここ

1

は、私たちがやったことで、これを行うに

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

最短の方法は次のとおりです。出力されます

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

XMLで

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

優雅な解決策ではありませんが、私は認めますが、正しく動作します。私のプロジェクトで試してみました。

関連する問題