[英]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);)
注意:我添加了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.