[<EntryPoint>]
let main argv =
let xd = XDocument.Load("MusicLibrary.xml")
(* XPathSelectElementsを使うやり方*)
let titles = xd.XPathSelectElements("musicLibrary/cd[string(year) = '1994']/title")
let showTitle =
(* 1994年のアルバムタイトルは複数あるかも *)
for title in titles do
printfn "The title='%s'" title.Value
(* でも一つのタイトルには一つのアーティストしかない *)
let artist= title.XPathSelectElement("parent::*/artist")
printfn "The artist='%s'" artist.Value
0
つぎにLINQのクェリー式を使う例を探してみたのですがMSDNにもどこにもF#の例はありません.どうもF#ではクェリー式は使えないようです.代わりにLINQ to XMLのAxis Methodを使うやり方はバッチリ動きました.
open System.Linq
[<EntryPoint>]
let main argv =
let xd = XDocument.Load("MusicLibrary.xml")
let xn s = XName.Get(s)
let queryTitles =
xd.Elements(xn "musicLibrary")
.Elements(xn "cd")
.Where(fun (cd:XElement) -> cd.Element(xn "year").Value.Equals("1994"))
.Elements(xn "title")
for title in queryTitles do
printfn "The title='%s'" title.Value
let artist= title.Ancestors().ElementAt(0).Element(xn "artist")
printfn "The artist='%s'" artist.Value
0
これで両方とも次の結果となります.
F#の違いは、Element軸メソッドのパラメータに"要素名"と直接書けないことです.ここは本来Stringはかけません.書けるのはXML 要素または属性の名前を表わすXNameです.
XName
あとF#なので、VBでWhere()にラムダ式を書いたところは、funキーワードをつかって、"fun (cd:XElement) -> cd.Element(xn "year").Value.Equals("1994")"と書いてあげることになります.
やっていて気が付いたのですけれど日本ではMSDNのコミュニティを見るとF#なんてメチャメチャ投稿数が少ないですね.なんとHTML1ページで表示完了です.USのは580ありました.まあVBは64,346も投稿があるので比べ物になりませんが.F#を勉強しようと思ったらまず海外のサイトを見ないと日本では情報は得られないようです.