SyndicationItem Content オブジェクトにいくつかの単純なタグを追加しています
"<p>Hello World</p>"
しかし、RSS フィードでは次のように表示されます。
"<p>Hello World</p>"
これを回避するためにさまざまな方法を試しましたが、どれもうまくいきません。
SyndicationItem Content オブジェクトにいくつかの単純なタグを追加しています
"<p>Hello World</p>"
しかし、RSS フィードでは次のように表示されます。
"<p>Hello World</p>"
これを回避するためにさまざまな方法を試しましたが、どれもうまくいきません。
ここで、古いバージョンの .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");
}