Problèmes de lecture de RSS avec C # et .net 3.5
J'ai été de tenter d'écrire quelques routines pour lire les flux RSS et ATOM en utilisant les nouvelles routines disponibles dans le Système.ServiceModel.La Syndication, mais malheureusement, le Rss20FeedFormatter bombes sur environ la moitié du flux j'ai essayer avec l'exception suivante:
An error was encountered when parsing a DateTime value in the XML.
Ce qui semble se produire chaque fois que le flux RSS exprime la date de publication dans le format suivant:
Thu, 16 Oct 08 14:23:26 -0700
Si l'alimentation exprime la date de publication GMT, les choses vont bien:
Thu, 16 Oct 08 21:23:26 GMT
S'il existe un moyen de contourner cela avec XMLReaderSettings, je n'ai pas trouvé. Quelqu'un peut-il aider?
source d'informationauteur dan90266
Vous devez vous connecter pour publier un commentaire.
RSS 2.0 formaté flux de syndication utiliser le RFC 822 date-spécification de temps lors de la sérialisation d'éléments comme pubDate et lastBuildDate. La RFC 822 date-spécification de temps est malheureusement un très "flexible" syntaxe pour exprimer le fuseau horaire composant d'un DateTime.
Fuseau horaire peut être indiqué de plusieurs façons. "UT" est le Temps Universel (anciennement appelé "Greenwich Mean Time"); "GMT" est autorisé à titre de référence à l'Heure Universelle. La norme militaire utilise un caractère unique pour chaque zone. "Z" est le Temps Universel. "A" indique une heure plus tôt, et "M" indique 12 heures plus tôt; "N" est une heure plus tard, et "Y" est de 12 heures plus tard. La lettre "J" n'est pas utilisé. Les autres deux autres formes sont prises à partir de la norme ANSI X3.51-1975. L'un permet d'indication explicite de la quantité de décalage de l'UT; l'autre utilise la commune 3-les chaînes de caractères pour indiquer des fuseaux horaires en Amérique du Nord.
Je crois que la question concerne la façon dont les zone composante de la RFC 822 date-valeur de temps en cours de traitement. L'alimentation du module de formatage semble pas être la manipulation de la date et l'heure qui utilisent un local différentiel d'indiquer le fuseau horaire.
En tant que RFC 1123 s'étend de la RFC 822 spécification, vous pouvez essayer d'utiliser le DateTimeFormatInfo.RFC1123Pattern ("r") afin de gérer la conversion problamatic la date et l'heure, ou écrire votre propre code d'analyse de la RFC 822 dates formatées. Une autre option serait d'utiliser un tiers de cadre à la place du Système.ServiceModel.La Syndication de l'espace de noms des classes.
Il semble il y a quelques problèmes connus avec date-le temps de l'analyse et de la Rss20FeedFormatter qui sont en voie de l'être adressée par Microsoft.
Basé sur la solution de contournement posté dans le rapport de bug de Microsoft sur ce j'ai fait un XmlReader spécifiquement pour la lecture SyndicationFeeds non-standard dates.
Le code ci-dessous est légèrement différent de celui du code dans la solution de contournement sur le site de Microsoft. Il prend également De l'opposition du conseil sur l'utilisation de la RFC 1123 modèle.
Au lieu de simplement appeler XmlReader.Créer (), vous devez créer XmlReader à partir d'un Flux. J'utilise la classe WebClient pour obtenir ce flux:
Ci-dessous est le code pour le SyndicationFeedXmlReader:
Encore une fois, c'est copié presque exactement à partir de la solution de contournement posté sur le site de Microsoft dans le lien ci-dessus. ...sauf que celui-ci fonctionne pour moi, et une posté dans Microsoft n'a pas.
NOTE: Un peu de personnalisation que vous pouvez faire est dans les deux tableaux au début de la classe. Selon n'importe quels domaines de votre non-standard d'alimentation, vous devrez peut-être ajouter d'autres éléments de ces tableaux.
Intéressant. Il ressemblerait à la date mise en forme n'est pas l'un de ceux naturellement attendu par la date de l'analyseur. Après avoir regardé l'alimentation des classes, il n'a pas l'air comme vous pouvez injecter dans votre propre mise en forme de la convention pour l'analyseur et ils il utilise probablement un régime spécifique pour la validation de la sensation.
Vous pourriez être en mesure de changer la façon dont le datetime analyseur se comporte en modifiant la la culture. Je n'ai jamais fait avant, donc je ne peux pas dire pour sûr que ça marcherait.
Une autre solution de la nuit à transformer les aliments que vous essayez de lire. Probablement pas le plus grand mais il pourrait vous obtenir autour de la question.
Bonne chance.
Un semblable problème persiste .NET 4.0 et j'ai décidé de travailler avec XDocument au lieu de l'invocation directe de SyndicationFeed. J'ai décrit la méthode appliquée (spécifique à mon projet ici). Ne peux pas dire que c'est la meilleure solution, mais il peut certainement être considéré comme un "plan de sauvegarde" dans le cas SyndicationFeed échoue.