2012-06-25 3 views
4

내 홈페이지에 내 블로그 게시물을 표시하려면 내 WordPress 블로그의 RSS 피드를 어떻게 사용합니까? 나는이해야 할 다음 코드 조각으로 실행 :ASP.NET에서 WordPress RSS 피드 사용

Function GetRSSFeed(strURL as String) as DataTable 
    'Get the XML data 
    Dim reader as XmlTextReader = New XmlTextReader(strURL) 

    'return a new DataSet 
    Dim ds as DataSet = New DataSet() 
    ds.ReadXml(reader)  
    Return ds.Tables(2) 
    End Function 

을하지만,이 라인에서 오류 아웃 : 다음과 같은 오류와 'ds.ReadXml (리더)': 아마도

A column named 'comments' already belongs to this DataTable. 

는 아무튼 이 코드는 2003 년 이후로 작동하지 않습니까? 누구든지 작동하는 코드 샘플을 가지고 있습니까? 미리 많은 감사드립니다!

답변

17

LINQ to XML을 사용하여 WordPress RSS 피드를 읽을 수 있습니다.

먼저 피드를 가져옵니다. Uri 인스턴스를 생성합니다.

var rssFeed = new Uri("http://cgeers.com/feed/"); 

그런 다음 GET 요청을 수행하십시오.

var request = (HttpWebRequest) WebRequest.Create(rssFeed); 
request.Method = "GET"; 
var response = (HttpWebResponse) request.GetResponse(); 

응답 스트림을 가져 와서 읽어 피드 내용을 다운로드하십시오. 아직 다운로드 한 내용을 분석하고 필요한 정보를 추출하기 위해 XML을 위의 using 문을 사용 LINQ 내

using (var reader = new StreamReader(response.GetResponseStream())) 
{ 
    var feedContents = reader.ReadToEnd(); 
    //... 
} 

.

var document = XDocument.Parse(feedContents); 

var posts = (from p in document.Descendants("item") 
      select new 
      { 
       Title = p.Element("title").Value, 
       Link = p.Element("link").Value, 
       Comments = p.Element("comments").Value, 
       PubDate = DateTime.Parse(p.Element("pubDate").Value) 
      }).ToList(); 

이제 결과를 반복 할 수 있습니다.

foreach(var post in posts) 
{ 
    Console.WriteLine(post.Title); 
    Console.WriteLine(post.Link); 
    Console.WriteLine(post.Comments); 
    Console.WriteLine(post.PubDate); 
} 

여기에 그냥 출력을 캡처하지만 자신의 블로그 게시물 클래스 또는 당신이 LINQ 쿼리에서 사용할 수있는 비슷한 것을 만들어 주시기 위해 익명 형식을 사용했다.

저는 C#에 익숙해 져 있습니다. 그래서 저는 그것을 회신에 사용했습니다. 하지만 쉽게 변환 할 수 있습니다. 사용할 수있는 일부 online converters이 있습니다.

DataSet (이 문제를 구현하는 데 개인적으로 사용하지 않는 문제)과 관련하여 동일한 이름의 노드가있는 항목 (블로그 게시물)이 원인입니다. 예를 들어

:

<comments>...</comments> 
<slash:comments>5</slash:comments> 

물론 두 번째는 다른 네임 스페이스 (슬래시)를 가지고 있지만, 데이터 집합의되는 ReadXml (...) 메소드는 네임 스페이스에 대해 상관하지 않는다. "comments"라는 두 번째 열을 만들려고합니다. 그것이 예외를받는 이유입니다.

원할 경우 DataSet/DataTable을 계속 사용할 수 있습니다. 위와 같이 LINQ to XML을 사용하여 피드의 데이터를 추출하면됩니다.

그런 다음 데이터 세트를 만들고 여기에 새 테이블을 추가하십시오.

var dataSet = new DataSet(); 
var blog = new DataTable("Blog"); 
blog.Columns.Add("Title", typeof(string)); 
blog.Columns.Add("Link", typeof(string)); 
blog.Columns.Add("Comments", typeof(string)); 
dataSet.Tables.Add(blog); 

추출 된 데이터에 반복 처리 및 DataTable에에 추가 :

foreach (var post in posts) 
{ 
    var newRow = blog.NewRow(); 
    newRow["Title"] = post.Title; 
    newRow["Link"] = post.Link; 
    newRow["Comments"] = post.Comments; 

    blog.Rows.Add(newRow); 
} 

짜잔는, 우리는 이제 더 이상 데이터 집합의되는 ReadXml (...) 방법에 의존함으로써 문제를 해결했습니다. 피드를 다운로드하고 관심있는 데이터를 추출하여 보관하십시오.

+0

고마워요! 이것은 데이터 테이블을 사용하는 것보다 훨씬 낫습니다. 게시물을 날짜순으로 정렬하는 방법이 있습니까 (가장 최근 게시물이 상단에 있는지 확인하기 만하면됩니까). – Zishan

+1

@Christophe : .NET 3.5 이후 RSS에 기본 클래스 라이브러리가 내장되었습니다. 두 줄의 코드로 RSS를로드 할 수 있습니다. –

+0

@Zishan : 물론, 게시물 IEnumerable (예 : posts.OrderByDescending (p => p.PubDate))을 정렬하십시오. –

3

나는 RSS/아톰의 클래스에 내장 된 시작할 것 : SyndicationFeed 나는 System.ServiceModel.Syndication 네임 스페이스에 시작할 것

using (XmlReader reader = XmlReader.Create(url)) 
{ 
    return SyndicationFeed.Load(reader); 
} 
5

, 직접 RSS 피드를 조작하는 클래스가 있습니다. 특히,이 유망 같습니다

XmlReader reader = XmlReader.Create("http://your.uri.here/feed.xml"); 
SyndicationFeed feed = SyndicationFeed.Load(reader); 

는 다음, SyndicationFeed 클래스를 탐구 특히 Items 수집은 RSS 항목을 포함해야합니다.

Protected Function getWordPressFeed(ByVal strUrl As String) As DataTable 

    Dim rssFeed = New Uri(strUrl) 
    Dim request = DirectCast(WebRequest.Create(rssFeed), HttpWebRequest) 
    request.Method = "GET" 
    Dim response = DirectCast(request.GetResponse(), HttpWebResponse) 
    Dim feedContents As String 
    Using reader = New StreamReader(response.GetResponseStream()) 
     feedContents = reader.ReadToEnd() 
    End Using 
    Dim document = XDocument.Parse(feedContents) 

    Static Dim dcNamespace As XNamespace 
    dcNamespace = "http://purl.org/dc/elements/1.1/" 

    Dim posts = (From p In document.Descendants("item") Select New With { _ 
     Key .Title = p.Element("title").Value, _ 
     Key .Link = p.Element("link").Value, _ 
     Key .Author = p.Element(dcNamespace + "creator").Value, _ 
     Key .Description = p.Element("description").Value, _ 
     Key .PubDate = DateTime.Parse(p.Element("pubDate").Value) _ 
    }).ToList() 

    Dim dataSet = New DataSet() 
    Dim blog = New DataTable("Blog") 
    blog.Columns.Add("Title", GetType(String)) 
    blog.Columns.Add("Link", GetType(String)) 
    blog.Columns.Add("Description", GetType(String)) 
    blog.Columns.Add("Author", GetType(String)) 
    blog.Columns.Add("PubDate", GetType(DateTime)) 

    dataSet.Tables.Add(blog) 
    For Each post In posts 
     Dim newRow = blog.NewRow() 
     newRow("Title") = post.Title 
     newRow("Link") = post.Link 
     newRow("Description") = post.Description 
     newRow("Author") = post.Author 
     newRow("PubDate") = post.PubDate 
     blog.Rows.Add(newRow) 
    Next 

    Return blog 

End Function 
0

이 기능으로 VB로 변환 @Christophe Geers의 좋은 해결책은 간단하다.

private async void ReadFeed() { 
    var rssFeed = new Uri("http://truestrengthmd.com/category/blog/feed"); 

    var request = (HttpWebRequest)WebRequest.Create(rssFeed); 
    request.Method = "GET"; 
    var _response = await request.GetResponseAsync(); 
    var response = (HttpWebResponse)_response; 

    using (var reader = new StreamReader(response.GetResponseStream())) 
    { 
     var feedContents = reader.ReadToEnd(); 

     var document = XDocument.Parse(feedContents); 

     var posts = (from p in document.Descendants("item") 
        select new 
        { 
         Title = p.Element("title").Value 
        }).ToList(); 

     foreach (var post in posts) 
     { 
      Debug.WriteLine(post.Title); 
     } 
    } 
} 
0

이것은 내가 나의 워드 프레스 피드 리더에 사용하는 것입니다 :

0

이 내 라이브러리를 사용할 수 있습니다

wprssapi.marcogriep.de 몇 줄의 코드를. 매우 쉽게 할 수 있습니다 :

//Get an Instance of Wordpress Controller (Singleton) 
       WordPressFeedController wp = WordPressFeedController.Instance; 

       //Load all the RSS Articles 
       wp.LoadRSS("http://www.its-all-about.de/rss"); 

       //Get the Newest Article (Check Docs for other functions) 
       var rssItem = wp.GetNewestItem(); 

       this.label1.Text = rssItem.Title; 

       //Text Only, Remove all the HTML Tags - Limit too 300 Chars 
       this.richTextBox1.Text = wp.RemoveHTMLFromText(rssItem.Summary.Substring(0, 300)) + "..."; 

       //Open RSS Article on Button Click 
       this.button1.Click += (s, e) => { 
        Process.Start(rssItem.Id); 
       };