bug report to Microsoft about this में पोस्ट किए गए कामकाज के आधार पर मैंने विशेष रूप से सिंडिकेशन फीड्स पढ़ने के लिए एक्सएमएल रीडर बनाया है जिसमें गैर-मानक तिथियां हैं।
नीचे दिया गया कोड माइक्रोसॉफ्ट की साइट पर वर्कअराउंड में कोड से थोड़ा अलग है। आरएफसी 1123 पैटर्न का उपयोग करने में Oppositional's advice भी लगता है।
बस XmlReader.Create() को कॉल करने के बजाय आपको स्ट्रीम से 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;
}
}
फिर, यह लगभग ठीक तरीके को कड़ी में माइक्रोसॉफ्ट साइट पर पोस्ट से कॉपी किया है ऊपर। ... सिवाय इसके कि यह मेरे लिए काम करता है, और माइक्रोसॉफ्ट में पोस्ट किया गया कोई नहीं था।
नोट: क्लास की शुरुआत में दो सरणी में आपको एक अनुकूलन करने की आवश्यकता हो सकती है। किसी भी अपर्याप्त फ़ील्ड के आधार पर आपकी गैर-मानक फ़ीड जोड़ सकती है, आपको उन सरणी में और आइटम जोड़ने की आवश्यकता हो सकती है।
स्रोत
2010-04-27 20:16:18
निर्मित इन भयानक हैं। आप आसानी से अपना खुद का आरएसएस, आरडीएफ और एटीओएम पार्सर्स लिख सकते हैं। मेरे पास एक ट्यूटोरियल और एक पूर्ण दृश्य स्टूडियो प्रोजेक्ट है जिसे आप डाउनलोड कर सकते हैं जो कि http://www.jarloo.com/rumormill-5/ – Kelly