プログラミング言語とXPath(5) F#

.NETのVBをやったのでF#がどうなのか試しておきます.最初にXPathSelectElementsを使う例です.これは簡単でVBと同じです.

open System.Xml.XPath
open System.Xml.Linq

[<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
open System.Xml.XPath
open System.Xml.Linq

[<EntryPoint>]
let main argv = 
    let xd = XDocument.Load("MusicLibrary.xml")
    (* LINQ to XMLのAxis Methodを使うやり方 *)
    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

これで両方とも次の結果となります.

イメージ 1


F#の違いは、Element軸メソッドのパラメータに"要素名"と直接書けないことです.ここは本来Stringはかけません.書けるのはXML 要素または属性の名前を表わすXNameです.

XName

なので、XName.Get(String)を使って文字列からXNameに明示的に変換してやらねばなりません.VBコンパイラが自動的に変換してくれるのですが、F#はそうはいかないようです.

あとF#なので、VBでWhere()にラムダ式を書いたところは、funキーワードをつかって、"fun (cd:XElement) -> cd.Element(xn "year").Value.Equals("1994")"と書いてあげることになります.

やっていて気が付いたのですけれど日本ではMSDNのコミュニティを見るとF#なんてメチャメチャ投稿数が少ないですね.なんとHTML1ページで表示完了です.USのは580ありました.まあVBは64,346も投稿があるので比べ物になりませんが.F#を勉強しようと思ったらまず海外のサイトを見ないと日本では情報は得られないようです.