Basado en la solución publicada en el bug report to Microsoft about this Hice un XmlReader específicamente para leer SyndicationFeeds que tienen fechas no estándar.
El código siguiente es ligeramente diferente del código en la solución en el sitio de Microsoft. También toma Oppositional's advice usando el patrón RFC 1123.
En lugar de simplemente llamar a XmlReader.Create(), necesita crear el XmlReader desde un Stream. Yo uso la clase WebClient para conseguir que la corriente:
WebClient client = new WebClient();
using (XmlReader reader = new SyndicationFeedXmlReader(client.OpenRead(feedUrl)))
{
SyndicationFeed feed = SyndicationFeed.Load(reader);
....
//do things with the feed
....
}
A continuación se muestra el código de la SyndicationFeedXmlReader:
public class SyndicationFeedXmlReader : XmlTextReader
{
readonly string[] Rss20DateTimeHints = { "pubDate" };
readonly string[] Atom10DateTimeHints = { "updated", "published", "lastBuildDate" };
private bool isRss2DateTime = false;
private bool isAtomDateTime = false;
public SyndicationFeedXmlReader(Stream stream) : base(stream) { }
public override bool IsStartElement(string localname, string ns)
{
isRss2DateTime = false;
isAtomDateTime = false;
if (Rss20DateTimeHints.Contains(localname)) isRss2DateTime = true;
if (Atom10DateTimeHints.Contains(localname)) isAtomDateTime = true;
return base.IsStartElement(localname, ns);
}
public override string ReadString()
{
string dateVal = base.ReadString();
try
{
if (isRss2DateTime)
{
MethodInfo objMethod = typeof(Rss20FeedFormatter).GetMethod("DateFromString", BindingFlags.NonPublic | BindingFlags.Static);
Debug.Assert(objMethod != null);
objMethod.Invoke(null, new object[] { dateVal, this });
}
if (isAtomDateTime)
{
MethodInfo objMethod = typeof(Atom10FeedFormatter).GetMethod("DateFromString", BindingFlags.NonPublic | BindingFlags.Instance);
Debug.Assert(objMethod != null);
objMethod.Invoke(new Atom10FeedFormatter(), new object[] { dateVal, this });
}
}
catch (TargetInvocationException)
{
DateTimeFormatInfo dtfi = CultureInfo.CurrentCulture.DateTimeFormat;
return DateTimeOffset.UtcNow.ToString(dtfi.RFC1123Pattern);
}
return dateVal;
}
}
De nuevo, esto se copia casi exacta de la solución publicada en el sitio de Microsoft en el enlace encima. ... excepto que este funciona para mí, y el publicado en Microsoft no.
NOTA: Un poco de personalización que puede necesitar hacer es en las dos matrices al inicio de la clase. Dependiendo de cualquier campo extraño que pueda agregar su feed no estándar, es posible que necesite agregar más elementos a esas matrices.
Los incorporados son horribles. Puede escribir fácilmente sus propios analizadores RSS, RDF y ATOM. Tengo un tutorial y un proyecto completo de estudio visual que puedes descargar y que solo hace eso http://www.jarloo.com/rumormill-5/ – Kelly