这是一个最近开始困扰我的 rss 提要解析器的错误。今天早上我的四个 RSS 提要开始抛出这个异常:
For security reasons DTD is prohibited in this XML document. To enable DTD processing set the DtdProcessing property on XmlReaderSettings to Parse and pass the settings into XmlReader.Create method.
代码过去可以正常工作,但我相信这四个特定的 rss 提要发生了变化,导致了这个问题。以前没有使用 DTD 的提要使用 DTD,或者我的 SyndicationFeed 无法解析的某种模式更改。
所以我将代码更改为
string url = RssFeed.AbsoluteUri;
XmlReaderSettings st = new XmlReaderSettings();
st.DtdProcessing = DtdProcessing.Parse;
st.ValidationType = ValidationType.DTD;
XmlReader reader = XmlReader.Create(url,st);
SyndicationFeed feed = SyndicationFeed.Load(reader);
reader.Close();
然后我开始收到此错误:
The 'html' element is not declared.
在
System.Xml.XmlValidatingReaderImpl.ValidationEventHandling.System.Xml.IValidationEventHandling.SendEvent(Exception exception, XmlSeverityType severity) at System.Xml.Schema.BaseValidator.SendValidationEvent(String code, String arg) at System.Xml.Schema.DtdValidator.ProcessElement() at System.Xml.Schema.DtdValidator.ValidateElement() at System.Xml.Schema.DtdValidator.Validate() at System.Xml.XmlValidatingReaderImpl.ProcessCoreReaderEvent() at System.Xml.XmlValidatingReaderImpl.Read() at System.Xml.XmlReader.MoveToContent() at System.Xml.XmlReader.IsStartElement(String localname, String ns) at System.ServiceModel.Syndication.Atom10FeedFormatter.CanRead(XmlReader reader) at System.ServiceModel.Syndication.SyndicationFeed.Load[TSyndicationFeed](XmlReader reader) at System.ServiceModel.Syndication.SyndicationFeed.Load(XmlReader reader)
我不知道这个“html”元素来自哪里,因为提要和提要中的任何可见 dtd 定义(http://jobs.huskyenergy.com/RSS)都没有提到它。我也尝试将其设置Dtdprocessing
为DtdProcessing.ignore
但是会导致以下错误:
The element with name 'html' and namespace '' is not an allowed feed format.
这更令人困惑,因为命名空间是空白的,我不确定这个被上帝遗弃的 html 元素来自哪里。
我非常接近于编写自己的 xml 阅读器并抓取 SyndicationFeed,但是我想确保在走这条路之前用尽所有可能的解决方案。
一个 RSS 提要,如果有帮助的话:http: //jobs.huskyenergy.com/RSS