F#TypeProvider"XMLProvider"给出了System.Exception

Cli*_*hie 4 f# type-providers f#-data

我正在尝试使用XML类型提供程序处理Twitter推文,如下面的代码所示.使用LINQ XElement函数访问tweet数据值时,代码工作正常,但是在使用XMLProvider创建的类型时,它会失败并出现例外情况:"XML不匹配:预计只有一个'title'子元素".我知道没有给出命名空间,但是,我不知道如果需要它们将如何与提供者一起指定.

// ...

open FSharp.Net
open FSharp.Data

let ns = "http://www.w3.org/2005/Atom"

// General helpers for XML

let xelem s (el: XContainer) = el.Element(XName.Get(s, ns)) 
// ...
let xvalue (el: XElement) = el.Value

let twitterUri = "http://search.twitter.com/search.atom?q=Windows8&rpp=100&lang=en"
type Tweets = XmlProvider<"SampleTweets.xml", Global=false>

let feed = Tweets.Load twitterUri

// title 0 & 1 produce correct values

let title0 = feed.XElement |> xelem "title" |> xvalue
let title1 = feed.XElement |> xelem "entry" |> xelem "title" |> xvalue

// title 2 produces: "XML mismatch: Expected exactly one 'title' child"

let title2 = feed.Title
let title3 = feed.GetEntries().[0].Title
Run Code Online (Sandbox Code Playgroud)

Gus*_*rra 5

这是FSharp.Data中的一个错误,与xml中存在默认命名空间有关xmlns="http://www.w3.org/2005/Atom".

版本1.1.3修复了此问题,但您也可以执行以下操作:

[<Literal>]
let twitterUri = "http://search.twitter.com/search.atom?q=Windows8&rpp=100&lang=en"
type Tweets = XmlProvider<twitterUri>

let feedXml = (Http.Request twitterUri).Replace("xmlns=\"http://www.w3.org/2005/Atom\"", null)

let feed = Tweets.Parse feedXml
let t = feed.Title
Run Code Online (Sandbox Code Playgroud)

  • 我不认为我说提供商存在严重缺陷,我只是说它有一个错误.无论如何,我已经提交了拉取请求,这是一个简单的修复(https://github.com/fsharp/FSharp.Data/pull/114).与FSharp.Data中的其他提供程序相比,Xml的使用要少得多,因为现在几乎所有东西都是Json,所以很自然它有更多错误. (2认同)