Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
F# 如何使用.NETCore从RSS源获取项目?_F#_.net Core - Fatal编程技术网

F# 如何使用.NETCore从RSS源获取项目?

F# 如何使用.NETCore从RSS源获取项目?,f#,.net-core,F#,.net Core,如何使用.NETCore从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&tag

如何使用.NETCore从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 "")
打开Microsoft.SyndicationFeed
打开Microsoft.SyndicationFeed.Rss
[]
让“从iTunes RSS源获取链接”()=
让url=”http://www.pwop.com/feed.aspx?show=dotnetrocks&filetype=master&tags=F%23"
使用reader=XmlReader.Create(url)
让feedReader=RssFeedReader(读卡器)
让可变链接模板={
Title=“”
Url=“”
}
让链接=
异步的{
让links=Collections.Generic.List()
而feedReader.Read()|>Async.AwaitTask |>Async.RunSynchronously do
将feedReader.ElementType与匹配
|SyndicationElementType.Link->
让item=feedReader.ReadLink()|>Async.AwaitTask |>Async.RunSynchronously
让link={linkTemplate with Title=item.Title;Url=item.Uri.AbsolutePath}
links.Add(link)
| _ -> ()
返回链接
}|>Async.RunSynchronously
reader.Close()
System.Diagnostics.Debug.WriteLine(链接[0]。标题)
链接。[0]。标题|>不应“(等于”)

具体地说,项目被读取,但读取后没有实际数据。

我按照建议使用了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
[]
让“从iTunes RSS源获取链接”()=
让toLink(项:XElement)={
Id=-1
ProfileId=“待派生…”
Title=item.Element(XName.Get(“Title”))|>string
Url=item.Element(XName.Get(“link”))|>string
Description=item.Element(XName.Get(“Description”))|>string
ContentType=Podcast |>contentTypeToString
主题=[]
IsFeatured=false
}
让baseAddress=”http://www.pwop.com/"
让url=“feed.aspx?show=dotnetrocks&filetype=master&tags=F%23”
使用client=httpClient基地址
让response=client.GetAsync(url)|>Async.task
|>异步运行
让链接=
if response.issucessStatusCode
然后让text=response.Content.ReadAsStringAsync()|>Async.AwaitTask |>Async.RunSynchronously
XElement.Parse(text).substands(XName.Get(“item”))|>Seq.toList |>List.map toLink
其他[]
links |>List.isEmpty |>应等于false

我发现仅仅使用HttpClient和XDocument就更容易了