我正在尝试使用 XML 类型提供程序处理 Twitter 推文,如下面的代码所示。当使用 LINQ XElement 函数访问推文数据值时,该代码工作正常,但是当使用由 XMLProvider 创建的类型时,它会失败并显示以下异常:“XML 不匹配:预期正好有一个‘标题’子项”。我知道没有给出命名空间,但是,如果需要它们,我不知道它们将如何与提供者一起指定。

// ...

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.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

关于F# TypeProvider "XMLProvider"给出 System.Exception,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15753005/

10-12 16:08