4

我正在使用 .NET 的 SyndicationFeed 创建 RSS 和 ATOM 提要。不幸的是,我需要描述元素中的 HTML 内容(SyndicationItem 的 Content 属性),并且格式化程序会自动对 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 做到这一点吗?我最后的手段是“手动”为提要创建 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 question,因为对我来说这个问题实际上是我出现这个问题的答案! 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 回答
3

可能为时已晚,但我留下了我的解决方案。我将它添加为 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));
于 2018-12-05T01:58:03.377 回答
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 回答
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;
       }
于 2014-02-03T15:28:51.220 回答
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 回答