2008-10-16 14 views
16

मैं सिस्टम में उपलब्ध नए दिनचर्या का उपयोग करके आरएसएस और एटीओएम फ़ीड पढ़ने के लिए कुछ दिनचर्या लिखने का प्रयास कर रहा हूं। सर्विसमोडेल। सिंडिकेशन, लेकिन दुर्भाग्यवश रुपये 20 फीडफॉर्मेटर लगभग आधा फीड पर बम। निम्न अपवादों के साथ प्रयास करें:सी # और .NET 3.5 के साथ आरएसएस पढ़ने में समस्याएं

गुरु, 16 अक्टू 08 14: 2

An error was encountered when parsing a DateTime value in the XML. 

यह तब हो जब भी आरएसएस फ़ीड निम्न स्वरूप में प्रकाशित तिथि को व्यक्त करता है लगता है 3:26 -0700

फ़ीड जीएमटी के रूप में प्रकाशित की तारीख को व्यक्त करता है, तो सब कुछ ठीक जाना:

गुरु, 16 अक्टू 08 21:23:26 GMT

यदि बहुत XMLReaderSettings के साथ इस पर काम करने का कोई तरीका, मुझे यह नहीं मिला है। क्या कोई सहायता कर सकता है?

+0

निर्मित इन भयानक हैं। आप आसानी से अपना खुद का आरएसएस, आरडीएफ और एटीओएम पार्सर्स लिख सकते हैं। मेरे पास एक ट्यूटोरियल और एक पूर्ण दृश्य स्टूडियो प्रोजेक्ट है जिसे आप डाउनलोड कर सकते हैं जो कि http://www.jarloo.com/rumormill-5/ – Kelly

उत्तर

9

आरएसएस 2.0 स्वरूपित सिंडिकेशन pubDate और lastBuildDate तरह RFC 822 date-time specification जब serializing तत्वों का उपयोग फ़ीड। आरएफसी 822 डेट-टाइम विनिर्देश दुर्भाग्य से डेटटाइम के समय-क्षेत्र घटक को व्यक्त करने के लिए एक बहुत ही 'लचीला' वाक्यविन्यास है।

समय क्षेत्र कई तरीकों से संकेत दिया जा सकता है। "यूटी" सार्वभौमिक समय है (जिसे पहले "ग्रीनविच मीन टाइम" कहा जाता था); "जीएमटी" को सार्वभौमिक समय के संदर्भ के रूप में अनुमति दी गई है। सैन्य मानक प्रत्येक जोन के लिए एक एकल चरित्र का उपयोग करता है। "जेड" सार्वभौमिक समय है। "ए" एक घंटे पहले इंगित करता है, और "एम" 12 घंटे पहले इंगित करता है; "एन" एक घंटे बाद है, और "वाई" 12 घंटे बाद है। पत्र "जे" का उपयोग नहीं किया जाता है। शेष शेष दो रूपों को एएनएसआई मानक एक्स 3.51-19 75 से लिया जाता है। एक यूटी से ऑफसेट की मात्रा के स्पष्ट संकेत की अनुमति देता है; दूसरा उत्तरी अमेरिका में समय क्षेत्र को इंगित करने के लिए सामान्य 3-वर्ण तारों का उपयोग करता है।

मेरा मानना ​​है कि इस मुद्दे में शामिल है कि जोन आरएफसी 822 दिनांक-समय मान का घटक संसाधित किया जा रहा है। फीड फॉर्मेटर समय क्षेत्र को इंगित करने के लिए स्थानीय अंतर का उपयोग करने वाले दिनांक-समय को संभालने वाला प्रतीत नहीं होता है।

चूंकि आरएफसी 1123 आरएफसी 822 विनिर्देश को बढ़ाता है, तो आप DateTimeFormatInfo.RFC1123Pattern ("आर") का उपयोग करके प्रोबलामैटिक दिनांक-समय को परिवर्तित करने के लिए या आरएफसी 822 प्रारूपित तिथियों के लिए अपना स्वयं का पार्सिंग कोड लिखने का प्रयास कर सकते हैं।एक और विकल्प सिस्टम के बजाय किसी तृतीय पक्ष ढांचे का उपयोग करना होगा। सर्विसमोडेल। सिंडिकेशन नेमस्पेस क्लासेस।

ऐसा लगता है कि कुछ known issues डेट-टाइम पार्सिंग और रुस 20 फीडफॉर्मेटर हैं जो माइक्रोसॉफ्ट द्वारा संबोधित किए जाने की प्रक्रिया में हैं।

+1

धन्यवाद - ऐसा लगता है कि यह माइक्रोसॉफ्ट के ध्यान में लाया गया था फरवरी में वापस था लेकिन यह तय नहीं है अभी तक। :( – dan90266

2

दिलचस्प। ऐसा लगता है कि डेटाटाइम स्वरूपण डेटाटाइम पार्सर द्वारा स्वाभाविक रूप से अपेक्षित लोगों में से एक नहीं है। फ़ीड वर्गों को देखने के बाद ऐसा नहीं लगता है कि आप पार्सर के लिए अपने स्वयं के स्वरूपण सम्मेलन में इंजेक्ट कर सकते हैं और वे संभवतः महसूस करने के लिए एक विशिष्ट योजना का उपयोग करते हैं।

आप culture को संशोधित करके डेटाटाइम पार्सर व्यवहार कैसे बदल सकते हैं। मैंने पहले कभी ऐसा नहीं किया है इसलिए मैं यह सुनिश्चित नहीं कर सकता कि यह काम करेगा।

एक और समाधान रात सबसे पहले उस फ़ीड को बदलने के लिए है जिसे आप पढ़ने की कोशिश कर रहे हैं। सबसे बड़ी संभावना नहीं है लेकिन यह आपको इस मुद्दे के आसपास ले जा सकती है।

शुभकामनाएं।

26

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; 

    } 

} 

फिर, यह लगभग ठीक तरीके को कड़ी में माइक्रोसॉफ्ट साइट पर पोस्ट से कॉपी किया है ऊपर। ... सिवाय इसके कि यह मेरे लिए काम करता है, और माइक्रोसॉफ्ट में पोस्ट किया गया कोई नहीं था।

नोट: क्लास की शुरुआत में दो सरणी में आपको एक अनुकूलन करने की आवश्यकता हो सकती है। किसी भी अपर्याप्त फ़ील्ड के आधार पर आपकी गैर-मानक फ़ीड जोड़ सकती है, आपको उन सरणी में और आइटम जोड़ने की आवश्यकता हो सकती है।

+0

ऐसा प्रतीत होता है कि आप इस विधि के साथ XmlReaderSettings का उपयोग करने में सक्षम होने के लिए छोड़ देते हैं, अर्थात् DtdProcessing विकल्प। उन फ़ीड के लिए एक समस्या अभी भी आरएसएस-0.91.dtd का संदर्भ देती है। – Ant

+4

यह मेरे लिए काम करता है, लेकिन मैंने डेटटाइम जोड़ा। पर्स (dateVal) पकड़ में। एक पूरी तरह से अच्छा डेटाटाइम फेंकने का कोई कारण नहीं है, यह सिर्फ प्रारूप में नहीं है प्रारूप में बनाया गया है। यहां मेरी अंतिम कक्षा है: https://gist.github.com/jaminto/4958435 – jaminto

1

ऐसा ही एक समस्या अभी भी .NET 4.0 में बनी रहती है और मैं XDocument के बजाय सीधे लागू SyndicationFeed के साथ काम करने का फैसला किया। मैंने लागू विधि का वर्णन किया (मेरे प्रोजेक्ट here के लिए विशिष्ट)। यह नहीं कह सकता कि यह सबसे अच्छा समाधान है, लेकिन सिंडिकेशन फीड विफल होने पर इसे निश्चित रूप से "बैकअप योजना" माना जा सकता है।

संबंधित मुद्दे