我正在使用.NET的SyndicationFeed来创建RSS和ATOM提要。不幸的是,我需要在描述元素(SyndicationItem的Content属性)中使用HTML内容,格式化程序会自动对HTML进行编码,但我宁愿将整个描述元素包装在CDATA中,而不对HTML进行编码。
我的(简单)代码:
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做到这一点?我最后的办法是“手动”为feed创建XML,但我宁愿使用内置的SyndicationFeed。
答案 0 :(得分: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))
答案 1 :(得分:4)
对于那些由cpowers和WonderGrub提供的解决方案也不起作用的人,你应该查看以下SO问题,因为对我来说这个问题实际上是我遇到这个问题的答案! Rss20FeedFormatter Ignores TextSyndicationContent type for SyndicationItem.Summary
从thelsdj
和Andy Rose
的肯定答案以及之后来自TimLeung
的“否定”答案以及WonderGrub
提供的替代方案判断,我会估计修复cpowers提供的服务停止在ASP.NET的某个更新版本中工作。
在任何情况下,上述SO文章中的解决方案(源自David Whitney的代码)解决了RSS 2.0 Feed中CDATA块中不需要的HTML编码的问题。我在ASP.NET 4.0 WebForms应用程序中使用它。
答案 2 :(得分:3)
这应该有用。
item.Content = new TextSyndicationContent("<b>Item Content</b>",TextSyndicationContentKind.Html);
答案 3 :(得分: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);
}
}
答案 4 :(得分:2)
可能为时已晚,但我离开了解决方案。我将其添加为ElementExtension,然后对我有用。我的环境是.NET 4.5。
XNamespace nsDefault = "http://www.w3.org/2005/Atom";
var content = new XElement(nsDefault + "content");
content.Add(new XCData("<b>Item Content</b>"));
item.ElementExtensions.Add(new SyndicationElementExtension(content));
答案 5 :(得分:1)
试试这个
XmlReaderSettings settings = new XmlReaderSettings();
settings.IgnoreComments = false;
//settings.ProhibitDtd = false;
using (XmlReader reader = XmlReader.Create(rssurl, settings))
答案 6 :(得分:1)
以下是我们的所作所为:
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);
}
}
}
然后使用该课程:
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;
}
答案 7 :(得分:0)
最简单的方法是:
.Content = SyndicationContent.CreateXhtmlContent("<![CDATA[The <em>content</em>]]>")
将以XML格式输出
<entry>
…
<content type="xhtml"><![CDATA[The <em>content</em>]]></content>
…
</entry>
我承认,这不是一个优雅的解决方案,但它运作正常 - 只是尝试过我的项目。
答案 8 :(得分:-3)
尝试
item.Content = "<![CDATA[" +
SyndicationContent.CreateHtmlContent("<b>Item Content</b>") + "]]>";