4

.NET の SyndicationFeed を使用して、RSS および ATOM フィードを作成しています。残念ながら、description 要素 (SyndicationItem の Content プロパティ) に HTML コンテンツが必要で、フォーマッタが HTML を自動的にエンコードしますが、HTML をエンコードせずに description 要素全体を 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 を使用したいと思います。

4

9 に答える 9

8

これは私のために働いた:

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))
于 2011-02-05T04:11:34.507 に答える
4

cpowers と WonderGrub が提供する解決策もうまくいかなかった人は、次の SO の質問をチェックしてください。私にとって、この質問は実際にこの問題の発生に対する答えだったからです! Rss20FeedFormatter は SyndicationItem.Summary の TextSyndicationContent タイプを無視します

からの肯定的な回答thelsdjAndy Rose、その後の「否定的な」回答TimLeungと、によって提供された代替案から判断WonderGrubすると、cpowers によって提供された修正は、ASP.NET の以降のバージョンなどで機能しなくなったと推定されます。

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

于 2013-05-23T22:52:08.343 に答える
3

これはうまくいくはずです。

item.Content =  new TextSyndicationContent("<b>Item Content</b>",TextSyndicationContentKind.Html);
于 2010-03-10T20:33:37.567 に答える
2

cpowers の例で WriteContentsTo オーバーライドが呼び出されていない場合と同じ問題がありました (理由はまだわかりません)。そのため、代わりに SyndicationContent クラスから継承するように変更しました。これが最善の解決策かどうかはわかりませんが、私の状況ではうまくいきました。

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);
    }
}
于 2013-04-11T19:14:46.977 に答える
1

これを試して

XmlReaderSettings settings = new XmlReaderSettings();
            settings.IgnoreComments = false;
            //settings.ProhibitDtd = false;
            using (XmlReader reader = XmlReader.Create(rssurl, settings))
于 2010-11-15T19:16:46.433 に答える
0

これを行う最短の方法は次のとおりです。

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

それはXMLで次のように出力されます

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

洗練されたソリューションではないことは認めますが、適切に機能します。私のプロジェクトで試しただけです。

于 2015-02-15T13:23:13.610 に答える
-3

試す

item.Content = "<![CDATA[" + 
            SyndicationContent.CreateHtmlContent("<b>Item Content</b>") + "]]>";
于 2009-07-13T09:20:08.407 に答える