F# F“类型提供者”;XMLProvider";给出了系统异常

F# F“类型提供者”;XMLProvider";给出了系统异常,f#,type-providers,f#-data,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"

我正在尝试使用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
/。。。
打开FSharp.Net
打开FSharp.Data
让ns=”http://www.w3.org/2005/Atom"
//XML通用帮助程序
设xelem s(el:XContainer)=el.Element(XName.Get(s,ns))
// ...
设xvalue(el:XElement)=el.Value
让twitterUri=”http://search.twitter.com/search.atom?q=Windows8&rpp=100&lang=en"
键入Tweets=XmlProvider
让feed=Tweets.Load twitterUri
//标题0和1生成正确的值
设title0=feed.XElement |>xelem“title”|>xvalue
让title1=feed.XElement |>xelem“entry”|>xelem“title”|>xvalue
//标题2生成:“XML不匹配:只需要一个‘标题’子项”
让title2=feed.Title
让title3=feed.GetEntries()[0]。Title

这是FSharp中的一个bug。数据与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
[]
让twitterUri=”http://search.twitter.com/search.atom?q=Windows8&rpp=100&lang=en"
键入Tweets=XmlProvider
让feedXml=(Http.Request twitterUri).Replace(“xmlns=\”http://www.w3.org/2005/Atom\“”,空)
让feed=Tweets.Parse feedXml
让t=feed.Title

问题不在于示例XML与实际XML不匹配吗?您能在这里包括这两个XML文件吗?(或者,更好的是,它们的简化版本仍然显示了这个问题。)Gustavo明确强调XmlProvider存在严重缺陷。Twitter提要xml应该被证明是该提供商的一个强大测试用例。例如,考虑一些由
twitter:
限定的元素。。。最近的
提供者肯定会为那些“twitter”限定元素创建类型字段
let rt=feed.GetEntries()[0]。Metadata.ResultType
但是,
ResultType
的值不可访问。我想我没有说提供程序有严重缺陷,我只是说它有缺陷。无论如何,我已经提交了一个拉请求,这是一个简单的修复()。与FSharp.Data中的其他提供者相比,Xml的使用要少得多,因为现在几乎所有的东西都是Json,所以它有更多的bug是很自然的。