これに関するMicrosoft へのバグ レポートに投稿された回避策に基づいて、非標準の日付を持つ SyndicationFeeds を読み取るための XmlReader を作成しました。
以下のコードは、Microsoft のサイトにある回避策のコードとは少し異なります。また、RFC 1123 パターンの使用に関するOppositional のアドバイスも取り入れています。
単純に XmlReader.Create() を呼び出す代わりに、Stream から XmlReader を作成する必要があります。そのストリームを取得するには、WebClient クラスを使用します。
WebClient client = new WebClient();
using (XmlReader reader = new SyndicationFeedXmlReader(client.OpenRead(feedUrl)))
{
SyndicationFeed feed = SyndicationFeed.Load(reader);
....
//do things with the feed
....
}
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;
}
}
繰り返しますが、これは上記のリンクの Microsoft サイトに掲載されている回避策からほぼ正確にコピーされています。...ただし、これは私には機能しますが、Microsoft に投稿されたものは機能しませんでした。
注: カスタマイズが必要になる可能性があるのは、クラスの最初にある 2 つの配列です。非標準フィードが追加する可能性のある不要なフィールドによっては、それらの配列にさらに項目を追加する必要がある場合があります。