如何从rss Feed中的无效标签中恢复

时间:2011-03-04 03:00:55

标签: c# xml rss

我正在研究RSS提要阅读器。某些Feed包含无效标签,例如< i>。和< b>在他们中(对RSS无效)。我解析它时遇到异常。

为了演示错误,我发布了示例代码。以下是一些信息:

异常消息:意外的节点类型元素。只能在具有简单或空内容的元素上调用ReadElementString方法。

例外: System.Xml.XmlException。

原始XML 请参阅此rss的XML:http://www.npr.org/rss/rss.php?id=1001。 查看页面源代码。问题出在第56行(rss中的< a>标记)

例外评论:如果您查看原始RSS,则有一个< a>标签在里面。 rss解析器不喜欢这样,所以它会抛出异常。错误在第34行(Console.WriteLine(ex.Message);)

在Rss供稿中处理HTML代码或忽略它们是否有好处?

注意:我添加了Microsoft的代码来扩展XmlTextReader类。它是绕过rss中无效日期的一种方法。忽略这一点。我将其添加到代码中以修复Microsoft的无关错误。

以下示例代码您可以运行以查看异常

   

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel.Syndication;
using System.Xml;
using System.Globalization;
using System.IO;
namespace RssTest
{
    class Program
    {
        static void Main(string[] args)
        {
            DoRSS();
        }


        public static void DoRSS()
        {
            string url = "https://west.thomson.com/about/feeds/west_prfeed.xml";
            var r = new MyXmlReader(url);
            SyndicationFeed feed = SyndicationFeed.Load(r);
            Rss20FeedFormatter rssFormatter = feed.GetRss20Formatter();
            XmlTextWriter rssWriter = new XmlTextWriter("rss.xml", Encoding.UTF8);

            rssWriter.Formatting = Formatting.Indented;
                rssFormatter.WriteTo(rssWriter);
                rssWriter.Close();

                foreach (var i in feed.Items)
                {

                    Console.WriteLine(i.Summary.Text);
                }

        }
    }


        //from microsoft
    public class MyXmlReader : XmlTextReader
    {
        private bool readingDate = false;
        const string CustomUtcDateTimeFormat = "ddd MMM dd HH:mm:ss Z yyyy"; // Wed Oct 07 08:00:07 GMT 2009

        public MyXmlReader(Stream s) : base(s) { }

        public MyXmlReader(string inputUri) : base(inputUri) { }

        public override void ReadStartElement()
        {
            if (string.Equals(base.NamespaceURI, string.Empty, StringComparison.InvariantCultureIgnoreCase) &&
                (string.Equals(base.LocalName, "lastBuildDate", StringComparison.InvariantCultureIgnoreCase) ||
                string.Equals(base.LocalName, "pubDate", StringComparison.InvariantCultureIgnoreCase)))
            {
                readingDate = true;
            }
            base.ReadStartElement();
        }

        public override void ReadEndElement()
        {
            if (readingDate)
            {
                readingDate = false;
            }
            base.ReadEndElement();
        }

        public override string ReadString()
        {
            if (readingDate)
            {
                string dateString = base.ReadString();
                DateTime dt;
                if (!DateTime.TryParse(dateString, out dt))
                    dt = DateTime.ParseExact(dateString, CustomUtcDateTimeFormat, CultureInfo.InvariantCulture);
                return dt.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture);
            }
            else
            {
                return base.ReadString();
            }
        }
    }


}



  

块引用

2 个答案:

答案 0 :(得分:0)

你不能,真的。如果数据不是有效的XML,则它不是有效的XML,并且Feed所有者需要修复它。这些标签需要转义,或者放在CDATA部分内。

答案 1 :(得分:0)