2013-04-01 33 views
4

我正在嘗試使用以下代碼所表示的XML類型提供程序來處理Twitter推文。當使用LINQ XElement函數訪問tweet數據值時,該代碼工作正常,但是在使用由XMLProvider創建的類型時,它失敗並出現一個異常:「XML不匹配:預期只有一個'標題'child'。我知道命名空間沒有給出,但是,我不知道如果他們需要,他們將如何與提供者一起指定。F#TypeProvider「XMLProvider」給出System.Exception

// ... 

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 
+0

是不是樣品XML不符合實際的XML問題?你可以在這裏包含兩個XML文件嗎? (或者,更好的是,它們的簡化版本仍然顯示這個問題。) – svick

回答

5

這是關係到一個事實,即有一個在XML xmlns="http://www.w3.org/2005/Atom"默認名稱空間中FSharp.Data的錯誤。

最新版本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 
+0

Gustavo肯定強調XmlProvider存在嚴重缺陷。 Twitter提要xml應該被證明是該提供商的強大測試用例。 '::例如,在考慮一些元件由'嘰嘰喳喳合格 ' ... <嘰嘰喳喳:result_type的>最近 ' \t \t 提供者明確地爲那些'twitter'限定的元素創建字段。 'let rt = feed.GetEntries()。[0] .Metadata.ResultType' \t 但是,ResultType的值是不可訪問的。 –

+2

我不認爲我說供應商存在嚴重缺陷,我只是說它有一個缺陷。無論如何,我已經提交了拉請求,這是一個簡單的修復(https://github.com/fsharp/FSharp.Data/pull/114)。 Xml比FSharp.Data中的其他提供者要少得多,因爲這些日子幾乎所有的東西都是Json,所以很自然的,它有更多的錯誤。 –

相關問題