2

SyndicationItem Content オブジェクトにいくつかの単純なタグを追加しています

"<p>Hello World</p>"

しかし、RSS フィードでは次のように表示されます。

"&lt;p&gtHello World&lt;/p&gt"

これを回避するためにさまざまな方法を試しましたが、どれもうまくいきません。

4

1 に答える 1

1

ここで、古いバージョンの .net で動作する多くのソリューションが提供されているのを見てきました。

SyndicationFeed: CDATA としてのコンテンツ?

ここでの後処理ソリューションと同様に:

https://gist.github.com/davidwhitney/1027181

最新バージョンの.netを使用しているため、最初のソリューションは実行できませんでした。2番目のソリューションは、非常に単純なものに対して多くのオーバーヘッドがかかるように見えたため、最終的にこのソリューションを実装しました。

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

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

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

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

}

そして、クラスを使用するには:

public static class FeedToStringBuilder
{
    public static StringBuilder CDataOverwriteMethod(Rss20FeedFormatter formatter)
    {
        var buffer = new StringBuilder();
        var xmlWriterSettings = new XmlWriterSettings {Indent = true};
        using (var stream = new StringWriter(buffer))
        using (var writer = new CDataWriter(stream))
        using (var xmlWriter = XmlWriter.Create(writer, xmlWriterSettings))
        {
            formatter.WriteTo(xmlWriter);
        }
        return buffer;
    }
}

コントローラーでの使用:

public ActionResult RssFeed()
{
    SyndicationFeed feed;
    using (var dataContext = new DataContext())
    {
        string urlBase = $"{Request.Url.Scheme}://{Request.Url.Authority}{Request.ApplicationPath.TrimEnd('/')}/";
        feed = new PodcastFeed(dataContext, Server).GetFeed(urlBase);
    }

    var rss20FeedFormatter = new Rss20FeedFormatter(feed);
    rss20FeedFormatter.SerializeExtensionsAsAtom = false;

    var feedXml = FeedToStringBuilder.CDataOverwriteMethod(rss20FeedFormatter).ToString();
    return Content(feedXml, "text/xml");
}
于 2014-02-03T15:24:03.907 に答える