RSS20FeedFormatter löst eine Ausnahme aus, wenn versucht wird, einige DateTime-Formate zu lesen
Dieser Artikel enthält Informationen System.Xml.XmlException dazu, wann Sie die SyndicationFeed.Load Methode zum Lesen von Datumsformaten aus einer RSS-Quelle verwenden.
Ursprüngliche Produktversion: Microsoft .NET Framework
Ursprüngliche KB-Nummer: 2020488
Problembeschreibung
Wenn Sie die SyndicationFeed.Load Methode zum Lesen aus einer RSS-Quelle verwenden, wird möglicherweise eine Fehlermeldung angezeigt, die folgendermaßen aussieht:
System.Xml. XmlException: Fehler in Zeile 7, Position 47. Beim Analysieren des XML-Codes des Feeds ist ein Fehler aufgetreten. Weitere Informationen finden Sie in der inneren Ausnahme.
Zeichenfolge wurde nicht als gültige DateTime erkannt.
Einige Feeds funktionieren möglicherweise ordnungsgemäß, während andere Feeds falsch funktionieren.
Ursache
Dieses Problem tritt aufgrund des Datumsformats auf, das im Feed verwendet wird. Die SyndicationFeed.Load Methode erwartet den Empfang von Feeds im Standardformat. Es folgt ein Beispiel für ein Standardformat:
Mon, 05 Oct 2009 08:00:06 GMT
Einige Feeds verwenden jedoch ein anderes Format. Einige Feeds können z. B. das folgende Format verwenden:
Wed Oct 07 08:00:07 GMT 2009
Lösung
Um dieses Problem zu umgehen, erstellen Sie einen benutzerdefinierten XML-Reader, der unterschiedliche Datumsformate erkennt. Es folgt ein Beispiel für einen benutzerdefinierten XML-Reader:
XmlReader 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();
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();
}
}
}