2017-11-15 4 views
2

.Net Coreを使用してRSSフィードからアイテムを取得するにはどうすればよいですか?.Net Coreを使用してRSSフィードからアイテムを取得するにはどうすればよいですか?

次のコードが動作するように表示されません。

open Microsoft.SyndicationFeed 
open Microsoft.SyndicationFeed.Rss 

[<Test>] 
let ``Get links from iTunes RSS Feed``() = 

    let url = "http://www.pwop.com/feed.aspx?show=dotnetrocks&filetype=master&tags=F%23" 
    use reader = XmlReader.Create(url) 
    let feedReader = RssFeedReader(reader) 

    let mutable linkTemplate = { 
     Title=   "" 
     Url=   "" 
    } 

    let links = 

     async { 

      let links = Collections.Generic.List<Link>() 

      while feedReader.Read() |> Async.AwaitTask |> Async.RunSynchronously do 

       match feedReader.ElementType with 
       | SyndicationElementType.Link -> 
        let item = feedReader.ReadLink() |> Async.AwaitTask |> Async.RunSynchronously      
        let link = { linkTemplate with Title= item.Title; Url= item.Uri.AbsolutePath } 
        links.Add(link) 
       | _ ->() 

      return links 

     } |> Async.RunSynchronously 

    reader.Close() 

    System.Diagnostics.Debug.WriteLine(links.[0].Title) 

    links.[0].Title |> should not' (equal "") 

具体的には、項目を読みますが、読み取り後には実際のデータはありませんされています。

+4

を、私はそれが簡単だけのHttpClientとXDocumentを使用することが判明 – Foole

答えて

3

推奨されているように私は、XElementのクラスを使用:

[<Test>] 
let ``Get links from iTunes RSS Feed``() = 

    let toLink (item:XElement) = { 
     Id =   -1 
     ProfileId = "to be derived..." 
     Title=  item.Element(XName.Get("title")) |> string 
     Url=   item.Element(XName.Get("link")) |> string 
     Description = item.Element(XName.Get("description")) |> string 
     ContentType= Podcast |> contentTypeToString 
     Topics =  [] 
     IsFeatured= false 
    } 

    let baseAddress = "http://www.pwop.com/" 
    let url = "feed.aspx?show=dotnetrocks&filetype=master&tags=F%23" 
    use client = httpClient baseAddress 

    let response = client.GetAsync(url) |> Async.AwaitTask 
             |> Async.RunSynchronously 
    let links = 
     if response.IsSuccessStatusCode 
      then let text = response.Content.ReadAsStringAsync()  |> Async.AwaitTask |> Async.RunSynchronously 
       XElement.Parse(text).Descendants(XName.Get("item")) |> Seq.toList  |> List.map toLink 
      else [] 

    links |> List.isEmpty |> should equal false 
関連する問題