2012-01-17 15 views
8

SyndicationFeedオブジェクトを使用してRss2、Atomフィードを解析しようとしています。 http://news.163.com/special/00011K6L/rss_newstop.xmlRSSフィードのDateTime解析での例外は、SyndicationFeedを使用しています。C#

<item id="2"> 
    <title>...</title> 
    <link>...</link> 
    <description>......</description> 
    <pubDate>2012-01-17 12:09:29</pubDate><-----Exception 
</item> 

URLリンクpubDateの

2012-01-17 8時01分06秒

public static List<SyndicationItem> getRssData(string url) 
{ 
    List<SyndicationItem> list = new List<SyndicationItem>(); 

    WebClient client = new WebClient(); 
    try 
    { 
     SyndicationFeed feed = SyndicationFeed.Load(XmlReader.Create(url)); 
     list = (from item in feed.Items select item).ToList(); 
    } 
    catch (Exception e) 
    { 
     throw e; 
    } 

    return list; 
} 

ようにDateTimeフィールドを解析している間しかし、私はXmlExceptionsを得ているに良い方法はありますこれを達成するには?助けてください。ありがとう。

+3

、なぜあなたはLINQクエリ式を使用していますリストを取得するには? 'list = feed.Items.ToList();'と等価です。問題の一部ではありませんが、それでも...(同様に、例外をキャッチして再投げてください。キャッチして再スローしたい場合は、throw eではなくthrowを使用してください; '。) –

答えて

3

基本的に、そのRSSフィードは無効です。 4(RSSで

すべての日付 - 時間は年が2つの文字または4つの文字で表現することができることを除いて、RFC 822の日付と時刻仕様に準拠:あなたはRSS 2.0 specificationを見れば、それは、と述べています好ましい)。

文字列「2012-01-17 12:09:29」は、"Date and Time" part of RFC 822に準拠していません。それは "17 01 2012 12:09:29"または同様のものでなければなりません。

14

回避方法がありますRSS20FeedFormatter throws exception trying to read some DateTime formatsです。

この問題を回避するには、さまざまな日付形式を認識するカスタムXMLリーダーを作成します。以下は、カスタムXMLリーダーの一例である:前のコードで使用

XmlReader r = new MyXmlReader(url); 
SyndicationFeed feed = SyndicationFeed.Load(r); 
Rss20FeedFormatter rssFormatter = feed.GetRss20Formatter(); 
XmlTextWriter rssWriter = new XmlTextWriter("rss.xml", Encoding.UTF8); 
rssWriter.Formatting = Formatting.Indented; 
rssFormatter.WriteTo(rssWriter); 
rssWriter.Close(); 

..andクラス:ちょうど興味のうち

class MyXmlReader : XmlTextReader 
{ 
    private bool readingDate = false; 
    const string CustomUtcDateTimeFormat = "ddd MMM dd HH:mm:ss Z yyyy"; // Wed Oct 07 08:00:07 GMT 2009 

    public MyXmlReader(Stream s) : base(s) { } 

    public MyXmlReader(string inputUri) : base(inputUri) { } 

    public override void ReadStartElement() 
    { 
     if (string.Equals(base.NamespaceURI, string.Empty, StringComparison.InvariantCultureIgnoreCase) && 
      (string.Equals(base.LocalName, "lastBuildDate", StringComparison.InvariantCultureIgnoreCase) || 
      string.Equals(base.LocalName, "pubDate", StringComparison.InvariantCultureIgnoreCase))) 
     { 
      readingDate = true; 
     } 
     base.ReadStartElement(); 
    } 

    public override void ReadEndElement() 
    { 
     if (readingDate) 
     { 
      readingDate = false; 
     } 
     base.ReadEndElement(); 
    } 

    public override string ReadString() 
    { 
     if (readingDate) 
     { 
      string dateString = base.ReadString(); 
      DateTime dt; 
      if(!DateTime.TryParse(dateString,out dt)) 
       dt = DateTime.ParseExact(dateString, CustomUtcDateTimeFormat, CultureInfo.InvariantCulture); 
      return dt.ToUniversalTime().ToString("R", CultureInfo.InvariantCulture); 
     } 
     else 
     { 
      return base.ReadString(); 
     } 
    } 
} 
関連する問題