2010-03-15 34 views
12

Tôi đang cố gắng kéo nội dung của nguồn cấp dữ liệu RSS vào một đối tượng có thể được điều khiển bằng mã. Có vẻ như các lớp SyndicationFeed và SyndicationItem trong .NET 3.5 sẽ làm những gì tôi cần, ngoại trừ một điều. Mỗi lần tôi cố gắng đọc nội dung của một nguồn cấp dữ liệu RSS bằng cách sử dụng lớp SyndicationFeed, phần tử .Content cho mỗi SyndicationItem là null.SyndicationItem.Content là Null

Tôi đã chạy nguồn cấp dữ liệu của mình thông qua FeedValidator và đã thử điều này với nguồn cấp dữ liệu từ một số nguồn khác, nhưng không có kết quả.

XmlReader xr = XmlReader.Create("http://shortordercode.com/feed/"); 
SyndicationFeed feed = SyndicationFeed.Load(xr); 

foreach (SyndicationItem item in feed.Items) 
{ 
    Console.WriteLine(item.Title.Text); 
    Console.WriteLine(item.Content.ToString()); 
} 

Console.ReadLine(); 

Tôi nghi ngờ tôi có thể đang bỏ lỡ một bước ở đâu đó, nhưng dường như tôi không thể tìm thấy hướng dẫn tốt về cách sử dụng các nguồn cấp dữ liệu RSS bằng các lớp này.

EDIT: Nhờ SLaks tôi đã tìm ra rằng vấn đề là với việc sử dụng WordPress làm thẻ nội dung. Điều này dường như không phải là vấn đề với nguồn cấp dữ liệu WP Atom nên tôi sẽ đi với giải pháp đó ngay bây giờ. Cảm ơn SLaks!

Trả lời

11

này sẽ nhận được nội dung dành cho bạn:

SyndicationFeed feed = SyndicationFeed.Load(reader); 

string content = feed.ElementExtensions.ReadElementExtensions<string>("encoded", "http://purl.org/rss/1.0/modules/content/") 
+0

Cảm ơn Francis. Tôi chỉ đi qua giải pháp này trên một bài SO và nó đã thực sự cho tôi những gì tôi cần. Trên thực tế nó đã giúp giải quyết hai hoặc ba vấn đề niggling khác là tốt! – kdmurray

+0

đã hoạt động khi đã thay đổi feed.items – Dragon

1

Sử dụng thuộc tính Summary.

Nguồn cấp dữ liệu RSS bạn đã liên kết để đặt nội dung trong phần tử <description>.
As documented, thành phần <description> của nguồn cấp dữ liệu RSS ánh xạ tới thuộc tính Summary.

+1

Thuộc tính tóm tắt chỉ cung cấp một lượng nhỏ nội dung từ nguồn cấp dữ liệu, phải không? – kdmurray

+0

Nó cung cấp phần tử ''. – SLaks

+0

Nhưng tôi đang tìm kiếm toàn văn của bài viết/bài đăng trên blog. Tôi có đi sai không? – kdmurray

4

Hãy xem những gì tôi đã làm:

XmlReader reader = XmlReader.Create("http://kwead.com/blog/?feed=atom"); 
    SyndicationFeed feed = SyndicationFeed.Load(reader); 
    reader.Close(); 

    foreach (SyndicationItem item in feed.Items) 
    { 
     string data = item.PublishDate.ToString(); 
     DateTime dt = Convert.ToDateTime(data); 

     string titulo = " - " + item.Title.Text + "<br>"; 
     string conteudo = ((TextSyndicationContent)item.Content).Text; 

     Response.Write(dt.ToString("d")); 
     Response.Write(titulo); 
     Response.Write(conteudo); 
    } 
+0

Điều này dường như hoạt động chính xác cho nguồn cấp dữ liệu nguyên tử, không may là đặc tả RSS cho phép các tiện ích mở rộng, đó là nội dung: điều mã hóa. Đó là hợp lệ, và đó là những gì ngăn chặn các mảnh item.content làm việc một cách chính xác. – kdmurray

6

của nó do thực tế rằng đó là nội dung: mã hóa thay vì nội dung. Để đọc nội dung trong trường hợp này, tôi sẽ sử dụng nội dung này:

string content=""; 
    foreach (SyndicationElementExtension ext in item.ElementExtensions) 
    { 
     if (ext.GetObject<XElement>().Name.LocalName == "encoded") 
      content = ext.GetObject<XElement>().Value; 
    }