簡體   English   中英

如何從RSS Feed中的無效標簽中恢復

[英]How do you recover from invalid tags in an rss feed

我正在使用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();
            }
        }
    }


}


塊引用

你不能,真的。 如果數據不是有效的XML,則它不是有效的XML,並且Feed所有者需要對其進行修復。 這些標簽需要轉義,或者放置在CDATA節的內部。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM