4

以下のコードで表されるように、XML タイプ プロバイダーを使用して Twitter のツイートを処理しようとしています。このコードは、LINQ XElement 関数を使用してツイート データ値にアクセスする場合は問題なく動作しますが、XMLProvider によって作成された型を使用すると、「XML の不一致: 'title' の子が 1 つだけ必要です」という例外が発生して失敗します。名前空間が指定されていないことは知っていますが、必要な場合にプロバイダーで指定する方法がわかりません。

// ...

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
4

1 に答える 1

5

これは、 xml にデフォルトの名前空間があるという事実に関連する FSharp.Data のバグでした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
于 2013-04-02T14:45:03.937 に答える