object Main {
def main(args: Array[String]) {
val titles = (root \\ "musicLibrary" \ "cd").filter(cd => (cd \ "year").text =="1994" ) \ "title"
titles.foreach(title => println("The title='" + title.text + "'"))
}
}
"\\"でXpathの"//"を表します."\"は"/"です.このようにdescendant::とchild::の軸を模式的に表現することができます.何故XPathのように"/"でなくて"\"なのかというと、Scalaの設計者のMartin Odeskeyさんは「Scala スケーラブルプログラミング」(インプレス)で以下のように述べています.
「Scalaでは、XPathの/や//ではなく、\や\\を使っている。それはScalaでは//をコメントの先頭に使っているからである。そこで他の記号を探さなければならなかったわけだが、幸いにももう1つのスラッシュがちょうどよく使えたわけだ。」
問題はScalaではXPath式そのものは使えないということと、LINQであったような軸メソッドがこの\や\\だけであるということです.例えば.NETの時は、titleから親にさかのぼってartist要素を得るようなコードが書けましたが、Scalaではできません.
以下の質問は、DITA-OTの開発者のJarno ElovirtaさんがScalaで親の要素を求めるのにはどうしたらいいか質問しています.
あとXPathの制約条件(predicate)にあたる部分もそこまで要素を抽出した結果にに対してfilterを使って書きます..NETのようにWhereを使って並列的に書いてゆくということはできません.
正直なところ少しがっかりしました.この点だけとればLINQの方が機能的にはるかに優れていると思います.
でも不便なものであれば、それを何とかしようという方はおられるようです.Scalaの標準のXMLサポート機能を置き換えるAnti-XMLや(http://anti-xml.org/)や、Scales XML(https://code.google.com/p/scala-scales/)の実装があります.
せっかくなのでAnti-XMLはScala 2.10でビルドしようとしてみましたが、初心者ではどうにもならないビルドエラーが解決できずテストに至りませんでした.2.9でやってみた方はおられるようです.
Scales XMLは結構本格的で、XPathも使えるし、軸メソッドもつかえるようです.Git Hubから落として、Scala2.10でのビルドは成功したのですが、Scala IDE for Eclipseのバグらしきものにぶつかってしまい、これもテストできませんでした.
また機会があったら再挑戦してみたいと思います.